ObservableCollection как DependencyProperty - PullRequest
10 голосов
/ 12 августа 2011

Я создаю приложение, в котором список объектов должен быть перехвачен и переведен перед отображением в группе элементов управления.Для этого я создал объект 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 никогда не вызывается, и новый элемент не отображается в моей коллекции в моем элементе управления.Я совершенно не в курсе?Что мне нужно сделать, чтобы это работало?

Ответы [ 2 ]

9 голосов
/ 12 августа 2011

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

0 голосов
/ 12 августа 2011

событие изменения коллекции подписывается только для значения по умолчанию BackupItems, которое вы задали в конструкторе ExplorerWindow. Затем вы заменяете значение по умолчанию на коллекцию в вашей модели представления, на которую вы не подписаны. Вы должны подписываться на collectionaged каждый раз, когда устанавливается свойство. Вы можете использовать перегрузку 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();
}
...