Почему обновление привязки не реализует INotifyPropertyChanged?

Я создал ViewModel и связал его свойство с двумя текстовыми полями в пользовательском интерфейсе. Значение другого текстового поля изменяется при изменении значения первого и фокуса из текстового поля, но я не внедряю INotifyPropertyChanged. Как это работает?

Ниже приводится XAML

         

И вот моя ViewModel

 class ViewModel { public string Name { get; set; } } 

Я проверил это, вы правы. Теперь я искал его в Интернете и нашел это .

Извините, что так долго отвечал, на самом деле вы сталкиваетесь с другим скрытым аспектом WPF , поэтому механизм привязки данных WPF привяжет данные к экземпляру PropertyDescriptor, который обертывает исходное свойство, если исходный объект является простым объектом CLR и не реализует Интерфейс INotifyPropertyChanged . И механизм привязки данных попытается подписаться на событие с измененным свойством через метод PropertyDescriptor.AddValueChanged (). И когда элемент данных, привязанный к целевым данным, изменит значения свойств, механизм привязки данных вызовет метод PropertyDescriptor.SetValue () для переноса измененного значения обратно в исходное свойство и одновременно будет вызывать событие ValueChanged для уведомления других подписчиков (в данном случае, другие подписчики будут TextBlocks в ListBox.

И если вы внедряете INotifyPropertyChanged, вы несете полную ответственность за внедрение уведомления об изменении в каждом наборе свойств, которые должны быть привязаны к пользовательскому интерфейсу. В противном случае изменение не будет синхронизировано, как вы ожидали.

Надеюсь, это немного облегчит ситуацию.

Таким образом, в основном вы можете это сделать, если это простой объект CLR. Довольно аккуратный, но совершенно неожиданный – и я проделал немного работы WPF в последние годы. Вы никогда не перестаете изучать новые вещи, верно?

Как предложил Хасан Хан, вот еще одна ссылка на довольно интересную статью по этому вопросу.

Обратите внимание, что это работает только при использовании привязки . Если вы обновите значения из кода , изменение не будет уведомлено . […]

При привязке WPF использует class PropertyInfo с гораздо меньшим весом. Если вы явно реализуете INotifyPropertyChanged, все, что нужно WPF, это вызвать метод PropertyInfo.GetValue, чтобы получить последнее значение. Это немного меньше, чем получение всех дескрипторов. Дескрипторы заканчиваются калькуляцией порядка 4x памяти classов информации о свойствах. […]

Внедрение INotifyPropertyChanged может быть справедливой частью утомительной разработки. Тем не менее, вам нужно взвесить эту работу против рабочего пространства (памяти и процессора) вашего приложения WPF. Внедрение INPC само по себе позволит сэкономить процессор и память времени исполнения .

Я могу объяснить, почему свойство обновляется при изменении фокуса: все UpdateSourceTrigger имеют свойство UpdateSourceTrigger которое указывает, когда будет обновлено свойство source. Значение по умолчанию для этого определено для каждого DependencyProperty а для свойства TextBox.Text установлено значение LostFocus , что означает, что свойство будет обновляться, когда элемент управления теряет фокус.

Я считаю, что ответ UrbanEsc объясняет, почему значение обновляется вообще

Я только что узнал, что это также работает в WinForms, вроде: /

 public class Test { public bool IsEnabled { get; set; } } var test = new Test(); var btn = new Button { Enabled = false, Text = "Button" }; var binding = new Binding("Enabled", test, "IsEnabled"); btn.DataBindings.Add(binding); var frm = new Form(); frm.Controls.Add(btn); test.IsEnabled = true; Application.Run(frm); 

Странно, однако, это не отключает кнопку:

 btn.Enabled = false; 

Это делает:

 test.IsEnabled = false; 
  • Список vs BindingList Преимущества / Недостатки
  • Установить значение null в привязке WPF
  • Как форматировать столбцы DateTime в DataGridView?
  • UITableView - лучшее редактирование посредством привязки?
  • WPF Binding - значение по умолчанию для пустой строки
  • Ввод текста заголовка WPF datagrid
  • Ошибка WPF: не удается найти управляющий элемент FrameworkElement для целевого элемента
  • «Элемент коллекции должен быть пустым перед использованием ItemsSource».
  • WPF StringFormat = {0: C}, показывающий как доллары
  • WPF: привязать DataGrid к списку
  • Как связать List с элементом управления DataGridView?
  • Давайте будем гением компьютера.