【问题标题】:ObservableCollection and CollectionViewObservableCollection 和 CollectionView
【发布时间】:2012-12-27 11:09:23
【问题描述】:

我正在编写一个从本地数据库读取数据并将它们显示在列表框中的应用程序(我在 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 属性也反映了这些更改。

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

【问题讨论】:

标签: c# wpf listbox observablecollection collectionviewsource


【解决方案1】:

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

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

【讨论】:

  • 没问题。帮助他人接受您认为最适合您的问题的答案。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多