手动更新目标后,OneWay绑定停止工作

时间:2009-02-28 15:15:14

标签: wpf binding

我有这样的WPF绑定代码:

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");

第二个断言失败了!这对我来说很奇怪。

另外,我尝试了'OneWayToSource'而不是'OneWay',并且都按预期工作。

Bind(source, target, BindingMode.OneWayToSource);

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

source.Attribute = "foo";

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

其他细节:

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); }
    }
}

我的代码出了什么问题?

4 个答案:

答案 0 :(得分:13)

设置target.Attribute =“foo”;清除了绑定。

MSDN:

  

不仅是动态资源和   绑定操作相同   他们是作为本地价值的优先权   真的是一个本地价值,但有一个   推迟的价值。一   这样做的结果是,如果你   拥有动态资源或绑定   物业价值的地方,任何地方   您随后设置的值   替换动态绑定或   完全绑定。即使你打电话   ClearValue清除本地设置   值,动态资源或绑定   将不会恢复。事实上,如果你   在具有的属性上调用ClearValue   动态资源或绑定到位   (没有“文字”本地价值),他们   由ClearValue调用清除   太

答案 1 :(得分:1)

不是绑定专家,但我相信您遇到了WPF依赖项属性优先级问题。直接设置值可能优先于绑定值。这就是为什么它会覆盖绑定。

这是一个完整的依赖属性列表:http://msdn.microsoft.com/en-us/library/ms743230.aspx

答案 2 :(得分:0)

  

示例:TextProperty是“Text”   TextBox的依赖属性。   在代码中调用这些应该是:

     

TextBox1.TextProperty = “值”;

WPF属性可以通过两种方式设置: 通过调用DependencyObject.SetValue方法(例如,instance.SetValue(TextProperty,“some text”)) 要么 使用CLR Wrapper(例如,instance.Text =“some text”)。

TextBox.TextProperty是一个静态DependencyProperty对象,因此您无法将字符串值分配给引用类型。

答案 3 :(得分:-1)

如果将绑定模式设置为OneWay,则意味着绑定仅以一种方式工作:目标在源更改时更新。

但是目标必须是依赖属性,而您拥有的代码是CLR .NET属性。您应该使用已注册的依赖项属性名称在目标上设置值,而不仅仅是普通的.NET属性名称。 Jared的答案非常正确,这可能会解决WPF依赖属性和普通.NET CLR属性之间的冲突。

如果遵循约定,依赖项属性应采用“propertyname”+ property的形式。

示例:TextProperty是TextBox的“Text”依赖项属性。在代码中调用这些应该是:

TextBox1.TextProperty="value";

有关设置绑定源的更多信息:

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