У меня есть ObservableCollection , которая привязана к ItemsControl (в основном отображает список).
Foo в основном выглядит следующим образом (есть другие члены, но он не реализует никаких интерфейсов или событий):
class Foo
{
public string Name { get; set; }
//...
}
Когда пользователь нажимает на элемент, я открываю диалоговое окно, где пользователь может редактировать свойства Foo (привязанные к небольшой модели представления со свойством Foo для выбранного элемента), Xaml выглядит следующим образом:
<TextBox Text="{Binding Foo.Name,Mode=TwoWay}"
Grid.Column="1" Grid.Row="0" Margin="2" />
Действительно странная вещь, , когда пользователь редактирует имя, значение в списке изменяется! (не при наборе текста, а после того, как фокус покидает поле)
Как это сделать? Я не реализовал интерфейс INotifyPropertyChanged для объекта Foo!
Пока я проверил, что он не просто обновляет весь список - только выбранный элемент. Но я не знаю, где можно установить точку останова, чтобы проверить, кто звонит.
Обновление: спасибо casperOne за ссылку на решение! Я добавлю здесь резюме, если оно будет 404:
[..] на самом деле вы столкнулись с еще одним скрытым аспектом WPF, то есть механизм привязки данных WPF будет привязывать данные к экземпляру PropertyDescriptor, который переносит свойство источника, если исходный объект является простым объектом CLR, и не реализует INotifyPropertyChanged. интерфейс. И механизм привязки данных попытается подписаться на событие измененного свойства с помощью метода PropertyDescriptor.AddValueChanged (). И когда целевой связанный элемент данных изменяет значения свойства, механизм привязки данных вызовет метод PropertyDescriptor.SetValue () для передачи измененного значения обратно в исходное свойство и одновременно вызовет событие ValueChanged для уведомления других подписчиков (в этом случае другие подписчики будут TextBlock в ListBox.
И если вы реализуете INotifyPropertyChanged, вы несете полную ответственность за реализацию уведомления об изменениях в каждом установщике свойств, которые должны быть данными, связанными с пользовательским интерфейсом. В противном случае изменение не будет синхронизировано, как вы ожидаете.