Как привязка данных избегает рекурсивного обновления в WPF?

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

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

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

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

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

6
задан Benny 20 May 2010 в 15:26
поделиться

1 ответ

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

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

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 будут отображать одно и то же значение - например, если вы установите свойство в 20, оба будут отображать 21. Событие property-changed срабатывает, когда свойство установлено в 20, отображается текущее значение 21, а привязка не обновляет источник.

0
ответ дан 18 December 2019 в 04:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: