2010-11-20 3 views
42

Der Grund, warum ich das frage, ist, weil ich von @Greg D (von this question) empfohlen wurde, stattdessen SetCurrentValue() zu verwenden, aber einen Blick auf die Dokumentation und didn ' t sehen was ist der Unterschied. Oder was bedeutet "ohne die Wertquelle zu ändern"?Was ist der Unterschied zwischen Dependency-Eigenschaft SetValue() & SetCurrentValue()

SetValue()

Legt den lokalen Wert einer Abhängigkeitseigenschaft, durch seine Abhängigkeitseigenschaft Kennung angegeben.

SetCurrentValue()

Setzt den Wert einer Abhängigkeitseigenschaft ohne die Wertquelle zu ändern.

Antwort

46

Die MSDN-Link vorgesehen, sagt ganz gut:

Diese Methode wird von einer Komponente verwendet wird , die programmatisch den Wert eines seiner eigenen Eigenschaften ohne setzt Deaktivierung einer Anwendung erklärt Verwendung der Eigentum. Die SetCurrentValue-Methode ändert den effektiven Wert der Eigenschaft, aber vorhandene Trigger, Datenbindungen und -Formatvorlagen funktionieren weiterhin.

Angenommen, Sie die TextBox Kontrolle zu schreiben und Sie haben eine Text Eigenschaft ausgesetzt, die Menschen oft wie folgt verwendet werden:

<TextBox Text="{Binding SomeProperty}"/> 

In Ihrem Code die Kontrolle, wenn Sie SetValue nennen Sie überschreiben die Bindung mit was auch immer du zur Verfügung stellst. Wenn Sie SetCurrentValue aufrufen, wird jedoch sichergestellt, dass die Eigenschaft den angegebenen Wert annimmt, aber keine Bindungen zerstört.

Soweit ich weiß, ist Gregs Rat falsch. Sie sollten immer GetValue/SetValue von Ihrer CLR-Wrapper-Eigenschaft verwenden. SetCurrentValue ist in Szenarios hilfreich, in denen Sie eine Eigenschaft benötigen, die einen bestimmten Wert annehmen kann, aber keine Bindungen, Trigger oder Stile überschreiben soll, die für Ihre Eigenschaft konfiguriert wurden.

+2

In Vincent Sibals Blog (http://blogs.msdn.com/b/vinsibal/archive/2009/05/21/the-control-local-values-bug-solution-and-new-wpf-4- 0-related-apis.aspx) können Sie am Ende lesen. "Für einen Steuerungsentwickler wird generell empfohlen, DependencyObject.SetCurrentValue über DependencyObject.SetValue im Steuerungscode zu verwenden. Sie werden feststellen, dass unsere Bestandskontrollen im 4.0-Framework alle aktualisiert wurden, um diese API zu verwenden, anstatt die Eigenschaften mit festzulegen lokale Werte. " Sie haben beide wahrscheinlich recht, aber können Sie den Unterschied hier und die Empfehlung aus dem Blog erklären? –

+1

@Meleak: Um ehrlich zu sein, denke ich, dass Post ist ein wenig unklar. Ich denke, er wollte sagen, dass "SetCurrentValue" überall in Ihrem Steuerelement verwendet werden soll, wo Sie * intern * den Wert einer Abhängigkeitseigenschaft ändern möchten.In der Tat, wenn Sie sein Beispielprojekt knacken, sehen Sie, dass er immer noch "GetValue" und "SetValue" im CLR-Property-Wrapper verwendet. In der Tat, wenn Sie einen offenen Reflektor gegen .NET 4.0 knacken, werden Sie sehen, dass dies immer noch der Fall ist. –

+2

Hmm, bisher habe ich 'SetValue' verwendet, wie es von Visual Studio erzeugt wurde, es funktioniert gut. Ich verstehe nicht wirklich, was du meinst, indem du die Bindung zerstörst. Nach der 1. Wertänderung wird meine Bindung nicht zerstört? cos kann ich noch Änderungen vornehmen und das Binding funktioniert noch? –

2

Im Anschluss an die akzeptierte Antwort:

fand ich, dass this post erklärt SetCurrentValue() ganz gut. Beachten Sie, wie das Prevence-System des Abhängigkeitseigenschaftswerts einen lokalen Wert über einem gebundenen Wert annimmt. Das erklärt das unerwartete Verhalten der Kommentatoren.

Verwandte Themen