ObservableCollection and CollectionView

本文关键字:CollectionView and ObservableCollection | 更新日期: 2023-09-27 17:49:52

我正在编写一个应用程序,从本地数据库读取数据并在列表框中显示它们(我在WPF中工作)。

我有一个DVD对象,它的属性是db的列。这个DVD对象也实现了INotifyPropertyChanged。"MyDVDs"是指向db的表。创建了这些对象之后,我创建了一个继承自ObservableCollection的类,并从构造函数中的"MyDVDs"中获取数据。但是,我不仅需要从列表框中添加、删除和更新数据,还需要对它们进行排序和过滤。下面是ObservableCollection的代码:

class ObservableDVD : ObservableCollection<DVD>
{
    private ICollectionView collection;
    public ObservableDVD(MyDVDs e)
    {
        foreach (DVD d in e.DVDs)
        {
            this.Add(d);
        }
        Collection = CollectionViewSource.GetDefaultView(this);
    }
    public ICollectionView Collection
    {
        get { return collection; }
        private set { collection = value; }
    }
}

我想知道,这是一个好方法吗??或者我能做得更好吗?

在项目的主窗口中,当Load_Window事件触发时,我将Collection属性分配给listbox。ItemSource(在MainWindow代码中,我声明了一个私有字段,显然引用了一个ObservableDVD Object)。我有一些按钮可以让我做我之前告诉你的操作。在按钮的事件头文件中,我直接更新和修改了ObservableDVD Object,而不是它的属性Collection。但是,Collection属性也反映了这些更改。

为什么会发生这种行为?对我来说没问题,但我不明白为什么会这样。是因为通知吗?

ObservableCollection and CollectionView

属性Collection有一个对ObservableDVD视图的引用。作为引用意味着指向内存中相同的数据。

ObservableCollection Class表示一个动态数据集合,当项被添加、删除或整个列表被刷新时提供通知。

您指定的集合只是ObservableDVD集合的一个"视图"。这意味着它们实际上都指向内存中的相同数据,它们不是两个独立的东西。例如,当您对集合应用过滤器时,"视图"可以是项的子集。

否则,你的ObservableDVD包含整个数据集的"数据表",而ICollectionView允许你通过自定义逻辑操作哪些记录/对象对用户可见。