Привязка работает без INotifyPropertyChanged, почему?
Вот как мы обычно это делаем:
public class ViewModel : INotifyPropertyChanged
{
string _test;
public string Test
{
get { return _test; }
set
{
_test = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string property = "") =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
Теперь наше свойство может использоваться несколькими элементами в представлении, например:
<TextBox Text="{Binding Test, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Text="{Binding Test}" />
Изменение значения в TextBox обновит содержимое TextBlock. Также мы можем установить значение в модели представления, и представление обновит его автоматически.
Если мы напишем модель вида следующим образом
public class ViewModel
{
public string Test { get; set; }
}
Тогдапредставление все еще работает (например, изменение значения в TextBox обновит TextBlock). Конечно, невозможно легко обновить значение Test с точки зрения модели больше нет (нет больше события, чтобы подняться). Но мой вопрос о представлении: Почему представление может работать? Создает ли он нечто большее в фоновом режиме или это логика, которая проверяет что-то?
1 ответ:
[...] вы сталкиваетесь с еще один скрытый аспект WPF-это механизм привязки данных WPF. привязка данных к экземпляру PropertyDescriptor, который обертывает источник свойство, если исходный объект является обычным объектом среды CLR и не имеет реализовать интерфейс INotifyPropertyChanged. И привязка данных движок попытается подписаться на измененное свойство события через Дескриптор свойства.Метод AddValueChanged (). И когда целевые данные связанный элемент изменяет свойство значения, механизм привязки данных будет вызова дескриптор свойства.Метод SetValue() для передачи измененного значения значение возвращается к исходному свойству, и оно будет одновременно повышаться ValueChanged событие для уведомления других подписчиков (в данном случае другие подписчики будут текстовыми блоками в списке.
И если вы реализуете INotifyPropertyChanged, вы полностью ответственный за реализацию уведомления об изменениях в каждом сеттере свойства, которые должны быть данными привязан к пользовательскому интерфейсу. В противном случае, изменения не будут синхронизированы, как вы ожидаете.
Comments