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

Ben*_*nny 6 data-binding wpf recursion

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

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

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

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

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

Rob*_*ney 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"));
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在创建一个包含两个TextBoxes 的窗口,这两个 esText绑定到Property此类实例上的属性。使两者都使用双向绑定,并UpdateSourceTrigger设置为PropertyChanged

每当您在其中一个边界中输入数字时TextBox,另一个边界TextBox将显示下一个数字。第一个绑定TextBox忽略PropertyChanged源引发的事件,因为该事件是在绑定期间发生的。第二个文本框确实由第一个事件更新PropertyChanged,但它不会用新值更新源。

如果您在代码中更新属性(例如,在按钮单击事件中),两个TextBoxes 将显示相同的值 - 例如,如果您将属性设置为 20,则两个 es 将显示 21。当属性被更改时,将触发 property-changed 事件。设置为 20,将显示当前值 21,并且绑定不会更新源。