2 回答
TA贡献1842条经验 获得超12个赞
我建议不要将ObservableCollection用作Items依赖项属性的类型。
在这里拥有ObservableCollection的原因(我想)是为了在CollectionChanged分配属性值时使UserControl能够附加处理程序。但是ObservableCollection太具体了。
WPF中的方法(例如在ItemsControl.ItemsSource中)是定义一个非常基本的接口类型(如IEnumerable),并在为属性分配值时,找出值集合是否实现了某些更特定的接口。这里至少是INotifyCollectionChanged,但是该集合也可以实现ICollectionView和INotifyPropertyChanged。所有这些接口不是强制性的,这将使您的依赖项属性可以绑定到各种类型的集合,从普通数组开始直到复杂的ItemCollection。
OnItemsChanged然后,您的属性更改回调将如下所示:
private static void OnItemsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
MyGrid grid = obj as MyGrid;
if (grid != null)
{
var oldCollectionChanged = e.OldValue as INotifyCollectionChanged;
var newCollectionChanged = e.NewValue as INotifyCollectionChanged;
if (oldCollectionChanged != null)
{
oldCollectionChanged.CollectionChanged -= grid.OnItemsCollectionChanged;
}
if (newCollectionChanged != null)
{
newCollectionChanged.CollectionChanged += grid.OnItemsCollectionChanged;
// in addition to adding a CollectionChanged handler
// any already existing collection elements should be processed here
}
}
}
private void OnItemsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
// handle collection changes here
}
添加回答
举报