2009-02-28 6 views
8
aktualisiert

Ich habe so WPF verbindlich Code:OneWay stoppt Bindung zu arbeiten, nachdem das Ziel manuell

TestModel source = new TestModel(); 
TestModel target = new TestModel(); 

Bind(source, target, BindingMode.OneWay); 

source.Attribute = "1"; 
AssertAreEqual(target.Attribute, "1"); 

target.Attribute = "foo"; 

source.Attribute = "2"; 
AssertAreEqual(target.Attribute, "2"); 

Die zweite Behauptung versagt! Das erscheint mir seltsam.

Außerdem habe ich 'OneWayToSource' anstelle von 'OneWay' versucht, und alles funktioniert wie erwartet.

Bind(source, target, BindingMode.OneWayToSource); 

target.Attribute = "1"; 
AssertAreEqual(source.Attribute, "1"); 

source.Attribute = "foo"; 

target.Attribute = "2"; 
AssertAreEqual(source.Attribute, "2"); 

Weitere Details:

void Bind(TestModel source, TestModel target, BindingMode mode) 
{ 
    Binding binding = new Binding(); 
    binding.Source = source; 
    binding.Path = new PropertyPath(TestModel.AttributeProperty); 
    binding.Mode = mode; 
    BindingOperations.SetBinding(target, TestModel.AttributeProperty, binding); 
} 

class TestModel : DependencyObject 
{ 
    public static readonly DependencyProperty AttributeProperty = 
     DependencyProperty.Register("Attribute", typeof(string), typeof(TestModel), new PropertyMetadata(null)); 

    public string Attribute 
    { 
     get { return (string)GetValue(AttributeProperty); } 
     set { SetValue(AttributeProperty, value); } 
    } 
} 

Was mit meinem Code falsch?

Antwort

13

Einstellung target.Attribute = "foo"; klärte die Bindung.

MSDN:

nicht nur dynamische Ressourcen und Bindungen arbeiten mit dem gleichen Vorrang als lokaler Wert, sie wirklich sind ein lokaler Wert, aber mit einem Wert, den aufgeschoben wird. Eine Folge davon ist, dass, wenn Sie eine dynamische Ressource oder Bindung in Ort für einen Eigenschaftswert haben , alle lokalen Wert, den Sie anschließend gesetzt die dynamische Bindung oder Bindung vollständig ersetzt. Selbst wenn Sie ClearValue aufrufen, um den lokal festgelegten Wert zu löschen, wird die dynamische Ressource oder Bindung nicht wiederhergestellt. Wenn Sie ClearValue für eine Eigenschaft aufrufen, die eine dynamische Ressource oder Bindung an Stelle (ohne "literal" lokalen Wert) hat, werden sie durch den ClearValue-Aufruf ebenfalls gelöscht.

1

Kein bindender Experte, aber ich glaube, dass Sie in eine WPF Abhängigkeit Eigenschaft Vorrang Probleme auftreten. Es ist wahrscheinlich, dass das Festlegen des Werts direkt Vorrang vor dem Bindungswert hat. Deshalb überschreibt es die Bindung.

Hier ist eine vollständige Abhängigkeitseigenschaft Eintrag: http://msdn.microsoft.com/en-us/library/ms743230.aspx

+0

Es macht Sinn, dass Wert gesetzt throught Stil den Template-Wert überschreiben wird, und der lokale Wert überschreibt den Style-Wert usw. Aber ich habe nichts davon. Also nicht sicher, das erklärt das Problem ... Danke irgendwie. – alex2k8

+0

Dies erklärt auch nicht den Unterschied zwischen OneWay und OneWayToSource – alex2k8

-1

Wenn Sie Modus OneWay set Bindung, bedeutet dies, dass die Bindung funktioniert nur in eine Richtung: das Ziel, wenn die Quelle Änderung aktualisiert wird.

Das Ziel muss jedoch eine Abhängigkeitseigenschaft sein, und der Code, den Sie haben, ist eine CLR .NET-Eigenschaft. Sie sollten den Wert für das Ziel mithilfe des registrierten Abhängigkeitseigenschaftsnamens und nicht nur eines normalen .NET-Eigenschaftsnamens festlegen. Die Antwort von Jared ist völlig richtig, dies könnte Verwirrung bei der Konfliktlösung zwischen der WPF-Abhängigkeitseigenschaft und der normalen .NET CLR-Eigenschaft verursachen.

Wenn Sie der Konvention folgen, sollte die Abhängigkeitseigenschaft in Form von "propertyname" + property sein.

Beispiel: TextProperty ist die "Text" -Abhängigkeitseigenschaft von TextBox. sollte diese im Code aufrufen: Weitere Informationen

TextBox1.TextProperty="value"; 

auf die Quelle der Bindungseinstellung:

http://msdn.microsoft.com/en-us/library/ms743643.aspx

+0

Ich habe das TestModel hinzugefügt, um confustion zu vermeiden ... Siehe auch meine Binding-Methode - ich verwende die WPF enplenency -Eigenschaft. Ich verwende den CLR-Eigenschaften-Wrapper, nur um den WPF-Eigenschaftswert festzulegen ... TextBox1.TextProperty = "value"; Was meinen Sie? TextBox-Instanz hat nur die Eigenschaft Text. – alex2k8

0

Beispiel: Textproperty ist "Text" Abhängigkeitseigenschaft von TextBox. Aufruf dieser Codes sollte sein:

TextBox1.TextProperty = "Wert";

WPF Eigenschaften kann auf zwei Arten eingestellt werden:. DependencyObject.SetValue durch Aufrufen der Methode (. ZB instance.SetValue (Textproperty, "some text")) oder Verwendung CLR Wrapper (zB instance.Text =“ etwas Text").

TextBox.TextProperty ist ein statisches Objekt DependencyProperty, so dass Sie nicht einen String-Wert auf einen Referenztyp zuordnen.

Verwandte Themen