我不知道它是否有帮助,但通常在 ViewModel 中,我将IList
或另一个不太具体的接口声明为属性类型而不是特定的接口。
然后我可以将准所有集合和列表绑定到这个属性。
在设置属性时,我检查它是否实现INotifyPropertyChanged
,如果是,我附加一个 CollectionChanged-EventHandler。当属性新更改时,我从旧的INotifyPropertyChanged
(如果是的话)中删除 EventHandler。
这样做的缺点是,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);
}