INotifyPropertyChanged
- не единственный интерфейс, который привязка WPF может использовать для уведомлений об изменениях, это просто тот, к которому мы больше всего привыкли. Как Bea Stollnitz пишет , ADO DataView
реализует IBindingList
, который реализует уведомление об изменении, вызывая ListChanged
при изменении списка или элемента в нем.
Это предлагает способ получить то, что вы хотите, хотя я не пробовал, чтобы увидеть, как это работает. Вы можете получить класс из DataView
, который прослушивает событие DataTable.RowChanged
и вызывает ListChanged
, если строка находится в представлении и ее RowState
изменилось.
Вы не сможете создать экземпляр этого нового DataView
в XAML без использования какого-либо кода позади или реализации модели представления, поскольку, если вы просто свяжетесь с DataTable
, это создаст обычный DataView
. Но вы также можете это исправить: подкласс DataTable
и переопределение GetDefaultView
, чтобы он возвращал экземпляр вашего нового DataView
, а затем подкласс DataSet
и переопределение Tables
, чтобы он возвращал экземпляр вашего нового DataTable
. (Ни один из этих классов, кажется, не запечатан, слава богу.)
Редактировать
Конечно, это не так просто. Список, который предоставляет DataView
, представляет собой коллекцию объектов DataRowView
. DataRowView
реализует INotifyPropertyChanged
. Я думаю, что WPF использует интерфейс IBindingList
на DataView
для уведомления об изменении коллекции и слушает PropertyChanged
на DataRowView
, хотя, честно говоря, мне нужно было бы еще немного покопаться, чтобы быть уверенным.
DataRowView
повышает PropertyChanged
только при изменении значения столбца в его строке. Я не вижу способа внедрить уведомление об изменении для других свойств в это без подкласса DataRowView
, и, хотя это в принципе возможно, я не вижу простого способа создания подкласса DataView
для создания этих новых DataRowView
объекты.