Обновления источника, вызванные событием с измененным свойством, не вызывают привязку, а события с измененным свойством, которые происходят, когда привязка обновляет источник, игнорируются.
Вот простой способ продемонстрировать это. Создать этот класс:
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, и привязки не обновляют источник.