Я изучаю привязку в WPF, затем у меня есть этот вопрос:
скажем, свойство зависимости связывается со свойством объекта, который реализует интерфейс INotifyPropertyChanged.
когда обязательная цель обновляет источник, затем свойство источника обновляется.
начиная с метода set свойства измененного исходного объекта это в свою очередь уведомит слушателя - обязательная цель, которая приведет к рекурсивному обновлению.
Как этого избегают в WPF?
Обновления источника, вызванные событием изменения свойства, не вызывают привязку, а события изменения свойства, происходящие во время обновления источника привязкой, игнорируются.
Вот простой способ продемонстрировать это. Создайте этот класс:
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, а привязка не обновляет источник.