2016-07-10 29 views
4

Ich möchte manchmal wissen, ob der Wert einer Abhängigkeitseigenschaft von Benutzereingaben oder von einer Änderung in der Bindungsquelle stammt. Ich habe noch keinen sauberen Weg gefunden, dies zu bestimmen.Gibt es eine Möglichkeit, festzustellen, ob der Wert einer DependencyProperty von der Bindungsquelle oder dem Ziel stammt?

Es gibt Sachen wie DependencyPropertyHelper aber es hilft nicht mit diesem Szenario, soweit ich das beurteilen kann.

Das Szenario: <TextBox Text="{Binding Foo}" />

Finden Sie heraus, ob es die Bindungsquelle oder Ziel, das Text zuletzt aktualisiert wurde. Oder etwas anderes, ja, ich bin mir dessen bewusst Auslöser, Erbschafts- Animationen etc.

Antwort

2

Ja, können Sie die Bindungsausdruck mit einer Abhängigkeitseigenschaft zugeordnet bekommen und seinen Status überprüfen:

BindingOperations.GetBindingExpressionBase(textBox, TextBox.TextProperty)?.Status == 
    BindingStatus.Active 

Sie es kombinieren mit DependencyPropertyHelper überprüfen, ob die aktuelle Quelle BaseValueSource.Local ist.

ValueSource hat eine Eigenschaft, die auf IsExpression genannt true gesetzt wird, wenn eine Bindung oder einen anderen Ausdruck verwendet wird, wie DynamicResource oder TemplateBinding.

Es ist schwieriger festzustellen, ob der aktuelle Wert von der Quelle oder dem Ziel stammt. AFAIK gibt es keinen besseren Weg, als dies:

<TextBox Text="{Binding Path=Foo, NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=True}" 
     SourceUpdated="OnSourceUpdated" TargetUpdated="OnTargetUpdated" /> 

Dann können Sie die Handler hookup OnSourceUpdated und OnTargetUpdated und einige Logik anwenden. Sie können auch eine angefügte Eigenschaft erstellen und für eine bessere Kapselung aktualisieren.

+0

Danke für die Antwort, werde mit diesem experimentieren müssen und sehen, ob es funktioniert. –

+0

Es zeigt "Status: Aktiv, BaseValueSource: Lokal" für beide, wenn der Wert von Quelle und Ziel kam, wenn ich es teste. –

+0

Oh, ich habe nicht verstanden, dass du zwischen Quelle und Ziel unterscheiden willst. Es gibt einen Weg, aber es ist nicht schön. Ich werde meine Antwort aktualisieren. –