我正在研究WPF中的绑定,然后我有这个问题:
假设依赖属性绑定到实现INotifyPropertyChanged接口的对象的属性。
当绑定目标更新源时,源的属性会更新。
由于源对象的属性设置器发生了变化,它将依次通知侦听器 - 绑定目标,这将导致递归更新。
如何在WPF中避免这种情况?
答案 0 :(得分:0)
由属性更改事件引起的源更新不会触发绑定,并且绑定更新源时发生的属性更改事件将被忽略。
这是一个简单的方法来证明这一点。创建这个类:
public class TestClass : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private int _Property;
public int Property
{
get { return _Property; }
set
{
if (value < 1000) // just to be on the safe side
{
_Property = value + 1;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Property"));
}
}
}
}
}
现在创建一个包含两个TextBox
es的窗口,其Text
绑定到此类实例上的Property
属性。同时使用双向绑定,UpdateSourceTrigger
设置为PropertyChanged
。
每当您在绑定TextBox
中键入数字时,另一个TextBox
将显示下一个数字。第一个TextBox
上的绑定忽略了源正在引发的PropertyChanged
事件,因为该事件在绑定期间发生。第二个文本框 由第一个PropertyChanged
事件更新,但它不会使用新值更新源。
如果您在代码中更新属性(例如,在按钮点击事件中),则TextBox
es将显示相同的值 - 例如如果将属性设置为20,则两者都将显示21.属性更改事件在属性设置为20时触发,显示当前值21,并且绑定不更新源。