Я бы предложил не использовать ObservableCollection в качестве типа Items
свойства зависимости.
Причина наличия ObservableCollection здесь (я полагаю) состоит в том, чтобы позволить UserControl подключать обработчик CollectionChanged
, когда назначено значение свойства. Но 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
}