数据绑定如何避免WPF中的递归更新?

时间:2010-05-20 15:13:22

标签: wpf data-binding recursion

我正在研究WPF中的绑定,然后我有这个问题:

假设依赖属性绑定到实现INotifyPropertyChanged接口的对象的属性。

当绑定目标更新源时,源的属性会更新。

由于源对象的属性设置器发生了变化,它将依次通知侦听器 - 绑定目标,这将导致递归更新。

如何在WPF中避免这种情况?

1 个答案:

答案 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,并且绑定不更新源。