1

我正在编写一个从本地数据库读取数据并将它们显示在列表框中的应用程序(我在 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; }
    }

}

我想知道,这是个好方法吗??还是我可以做得更好?

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

为什么会出现这种行为?对我来说没关系,但我不明白为什么会这样。是因为通知吗?

4

2 回答 2

1

属性 Collection引用了 ObservableDVD 的视图。作为参考意味着指向内存中的相同数据。

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

于 2012-12-27T13:43:15.423 回答
0

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

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

于 2012-12-27T13:45:13.453 回答