OneWay binding stops working after the target manually updated

后端 未结 4 660
长情又很酷
长情又很酷 2021-01-12 05:10

I have such WPF binding code:

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

Bind(source, target, BindingMode.OneWay);

source.Attr         


        
相关标签:
4条回答
  • 2021-01-12 05:33

    If you set Binding Mode to OneWay, this means that the binding works only in one way: the target is updated when the source change.

    But the target must be a dependency property, and the code you have is a CLR .NET property. You should set the value on the the target using the registered dependency property name, not just an ordinary .NET property name. The Jared's answer is quite right, this might bring confusion in resolving conflict between WPF dependency property and ordinary .NET CLR property.

    If you follow the convention, the dependency property should be in the form of "propertyname"+property.

    Example: TextProperty is "Text" dependency property of TextBox. Calling these in code should be:

    TextBox1.TextProperty="value";
    

    For more information on setting the source of Binding:

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

    0 讨论(0)
  • 2021-01-12 05:55

    Example: TextProperty is "Text" dependency property of TextBox. Calling these in code should be:

    TextBox1.TextProperty="value";

    WPF properties can be set two ways: by invoking DependencyObject.SetValue method (eg. instance.SetValue(TextProperty,"some text")) or using CLR Wrapper (eg. instance.Text="some text").

    TextBox.TextProperty is a static DependencyProperty object, so you can't assign a string value to a reference type.

    0 讨论(0)
  • 2021-01-12 05:57

    Setting target.Attribute = "foo"; cleared the binding.

    MSDN:

    Not only do dynamic resources and bindings operate at the same precedence as a local value, they really are a local value, but with a value that is deferred. One consequence of this is that if you have a dynamic resource or binding in place for a property value, any local value that you set subsequently replaces the dynamic binding or binding entirely. Even if you call ClearValue to clear the locally set value, the dynamic resource or binding will not be restored. In fact, if you call ClearValue on a property that has a dynamic resource or binding in place (with no "literal" local value), they are cleared by the ClearValue call too.

    0 讨论(0)
  • 2021-01-12 05:57

    Not a binding expert but I believe you are running into a WPF dependency property precedence issues. It's likely that setting the value directly takes precedence over the binding value. That's why it overrides the binding.

    Here's a full dependency property listing: http://msdn.microsoft.com/en-us/library/ms743230.aspx

    0 讨论(0)
提交回复
热议问题