INotifyPropertyChanged
— не единственный интерфейс, который привязка WPF может использовать для уведомлений об изменениях, это просто тот, к которому мы больше всего привыкли. Как пишет Беа Столлниц, 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
.
person
Robert Rossney
schedule
09.02.2011