ObservableCollection作为DependencyProperty

13

我正在创建一个应用程序,在其中对一组控件显示之前需要拦截并翻译对象列表。为此,我创建了一个ObservableCollection类型的DependencyProperty(BackupEntry是定义有关数据库信息的自定义类)。我想要实现的是将控件绑定到MVVM中的ObservableCollection。此集合可用于最初加载控件。然后,当通过控件界面添加条目时,它应该添加到作为DependencyProperty定义的内部ObservableCollection中,并显示在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从未被调用,新项目未显示在控件的集合中。我是完全偏离轨道了吗?为使其正常工作,我需要做什么?


以上的代码是你的ViewModel吗?如果是,为什么要使用Dependency对象而不是属性? - Dean Chalk
不,上面的代码是我控件的代码后台。输入到列表中的数据与用于显示它的控件之间没有直接关联。DependencyObject旨在公开列表,以便可以将其绑定并传递数据到和从控件。 - Dirk Dastardly
2个回答

11

你需要按照这个问题中提供的模式来操作。如上链接所示,在PropertyChanged处理程序中订阅CollectionChanged事件。


0

集合更改事件仅订阅了ExplorerWindow构造函数中设置的BackupItems的默认值。然后,您将默认值替换为视图模型中的集合 - 您尚未订阅该集合。每次设置属性时,您需要订阅collectionchanged。您可以使用接受PropertyMetadata的DependencyProperty.Register重载,并提供在属性更改时的回调。这是一个大致的草图 - 尚未编译,但应指向正确的方向。

 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();
}

它不起作用。DependencyProperty是静态的,但OnBackupItemsChanged不是。 - Don Tomato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接