Я не знаю, помогает ли это, но часто в ViewModel я объявляю IList
или другой менее специфичный интерфейс в качестве типа свойства вместо определенного.
Тогда я могу связать квази все коллекции и списки с этим свойством.
Пока свойство установлено, я проверяю, реализует ли оно INotifyPropertyChanged
и, если да, я присоединяю CollectionChanged-EventHandler.Когда свойство изменилось заново, я удаляю EventHandler из старого INotifyPropertyChanged
(если он был).
Недостатком этого является то, что ViewModel должен быть подготовлен для просмотра объектов других типов, чем ожидалось.Но обычно это простая работа.
void YourDPValueChanged(DependencyPropertyChangedEventArgs e) {
INotifyCollectionChanged newCollection = e.NewValue as INotifyCollectionChanged;
INotifyCollectionChanged oldCollection = e.OldValue as INotifyCollectionChanged;
if (null != newCollection) {
newCollection.CollectionChanged += new NotifyCollectionChangedEventHandler(Collection_CollectionChanged);
}
if (null != oldCollection) {
oldCollection.CollectionChanged -= new NotifyCollectionChangedEventHandler(Collection_CollectionChanged);
}