ObservableCollection как DependencyProperty

Я создаю приложение, в котором список объектов должен быть перехвачен и перенесен перед отображением в группе элементов управления. С этой целью я создал DependencyProperty типа ObservableCollection (BackupEntry - это настраиваемый класс, определяющий информацию о базе данных). Я хочу, чтобы элемент управления был связан с ObservableCollection в MVVM. Эта коллекция может использоваться для первоначальной загрузки элемента управления. Затем, когда запись добавляется через интерфейс управления, она должна быть добавлена ​​во внутренний ObservableCollection, который определяется как DependencyProperty и отображается в коллекции MVVM с момента их привязки. Вот код, который я использую:

protected ObservableCollection<BackupEntry> _BackupItems = new ObservableCollection<BackupEntry>();

public static readonly DependencyProperty BackupItemsProperty = DependencyProperty.Register("BackupItems", typeof(ObservableCollection<BackupEntry>), typeof(ExplorerWindow));

public ObservableCollection<BackupEntry> BackupItems
{
    get { return (ObservableCollection<BackupEntry>)GetValue(BackupItemsProperty); }
    set { SetValue(BackupItemsProperty, value); }
}

public ExplorerWindow()
{
    DefaultStyleKeyProperty.OverrideMetadata(typeof(ExplorerWindow), new FrameworkPropertyMetadata(typeof(ExplorerWindow)));
    SetValue(BackupItemsProperty, _BackupItems);
    _BackupItems.CollectionChanged += new NotifyCollectionChangedEventHandler(BackupItems_CollectionChanged);
}

void BackupItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    throw new NotImplementedException();
}

И в тестовом приложении:

<my:ExplorerWindow Name="ew" HorizontalAlignment="Left" VerticalAlignment="Top" Width="503" Height="223" BackupItems="{Binding BackupListItems}" />

Я создал кнопку на экране в своем тестовом приложении. При нажатии на элемент BackupListItems добавляется элемент. BackupItems_CollectionChanged никогда не вызывается, и новый элемент не отображается в моей коллекции в моем элементе управления. Неужели я полностью отсюда? Что мне нужно сделать, чтобы это работало?

Ответ 1

Вы должны следовать шаблону, указанному в этом вопросе. Вам нужно подписаться на событие CollectionChanged в обработчике PropertyChanged, как показано в приведенной выше ссылке.

Ответ 2

событие с изменением коллекции подписано только на значение по умолчанию для BackupItems, которое вы устанавливаете в конструкторе ExplorerWindow. Затем вы заменяете значение по умолчанию на коллекцию в своей модели просмотра, на которую вы не подписаны. Вы должны подписываться на collectionchanged каждый раз, когда свойство установлено. Вы можете использовать перегрузку DependencyProperty.Register, которая принимает PropertyMetadata и предоставляет обратный вызов для изменения свойства. Здесь грубый эскиз - не скомпилировал его, а должен указать вам в правильном направлении.

 public static readonly DependencyProperty BackupItemsProperty = DependencyProperty.Register(
    "BackupItems", 
    typeof(ObservableCollection<BackupEntry>), 
    typeof(ExplorerWindow), 
    OnBackupItemsChanged);

private void OnBackupItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var old = (ObservableCollection<BackupEntry>)e.OldValue;
    if (old != null) 
    {
       old.CollectionChanged -= BackupItems_CollectionChanged;
    }
    ((ObservableCollection<BackupEntry>)e.NewValue).CollectionChanged += BackupItems_CollectionChanged;
}

void BackupItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    throw new NotImplementedException();
}