我有这样的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); }
}
}
我的代码出了什么问题?
答案 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";
有关设置绑定源的更多信息: