Как привязка данных позволяет избежать рекурсивного обновления в WPF? - PullRequest
6 голосов
/ 20 мая 2010

Я изучаю связывание в WPF, тогда у меня есть этот вопрос:

скажем, свойство зависимости привязано к свойству объекта, который реализует интерфейс INotifyPropertyChanged.

когда цель привязки обновляет источник, свойство источника обновляется.

поскольку установщик свойств исходного объекта изменился, он, в свою очередь, уведомит слушателя - цель привязки, что приведет к рекурсивному обновлению.

Как этого избежать в WPF?

1 Ответ

0 голосов
/ 20 мая 2010

Обновления источника, вызванные событием с измененным свойством, не вызывают привязку, а события с измененным свойством, которые происходят, когда привязка обновляет источник, игнорируются.

Вот простой способ продемонстрировать это. Создать этот класс:

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, чьи Text связаны со свойством Property в экземпляре этого класса. Используйте оба способа двустороннего связывания, для UpdateSourceTrigger установлено значение PropertyChanged.

Всякий раз, когда вы вводите число в любую границу TextBox, другой TextBox будет отображать следующее число. Привязка к первому TextBox игнорирует событие PropertyChanged, которое вызывает источник, поскольку это событие происходит во время привязки. Второе текстовое поле действительно обновляется первым событием PropertyChanged, но не обновляет источник новым значением.

Если вы обновите свойство в коде (например, в событии нажатия кнопки), оба TextBox es будут отображать одно и то же значение - например, если установить для свойства значение 20, оба будут отображать 21. Событие изменения свойства возникает, когда для свойства установлено значение 20, отображается текущее значение 21, и привязки не обновляют источник.

...