Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ObservableCollection和CollectionView_C#_Wpf_Listbox_Observablecollection_Collectionviewsource - Fatal编程技术网

C# ObservableCollection和CollectionView

C# ObservableCollection和CollectionView,c#,wpf,listbox,observablecollection,collectionviewsource,C#,Wpf,Listbox,Observablecollection,Collectionviewsource,我正在编写一个从本地数据库读取数据并在列表框中显示它们的应用程序(我在WPF中工作) 我有一个DVD对象,它的属性是db的列。此DVD对象还实现INotifyPropertyChanged。“MyDVD”是指数据库的表格。创建这些对象后,我创建了一个类,该类继承自ObservableCollection,并从构造函数中的“MyDVD”获取数据。但是,我不仅需要添加、删除和更新列表框中的数据,还需要对它们进行排序和过滤。以下是ObservableCollection的代码: class Obser

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

我有一个DVD对象,它的属性是db的列。此DVD对象还实现INotifyPropertyChanged。“MyDVD”是指数据库的表格。创建这些对象后,我创建了一个类,该类继承自ObservableCollection,并从构造函数中的“MyDVD”获取数据。但是,我不仅需要添加、删除和更新列表框中的数据,还需要对它们进行排序和过滤。以下是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; }
    }

}
class ObservableDVD:ObservableCollection
{
私有ICollectionView集合;
公众可观察的VD(MyDVD e)
{
foreach(e.DVD中的DVD d)
{
本条增补(d);
}
Collection=CollectionViewSource.GetDefaultView(此);
}
公共ICollectionView集合
{
获取{return collection;}
私有集{collection=value;}
}
}
我想知道,这是个好办法??还是我能做得更好

在项目的主窗口中,当Load_Window事件激发时,我将集合属性分配给listbox.ItemSource(在后面的主窗口代码中,我声明了一个私有字段,该字段显然引用了ObservableVD对象)。我有一些按钮,允许我执行我之前告诉您的操作。在按钮的标题事件中,我直接更新和修改ObservableVD对象,而不是其属性集合。但是,集合属性也反映了这些更改

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

属性集合与ObservableVD的视图之间存在冲突。作为引用意味着指向内存中的相同数据


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

属性集合与ObservableVD视图之间有关联。作为引用意味着指向内存中的相同数据


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

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


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

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


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

我已编辑了您的标题。请看“”,其中的共识是“不,他们不应该”。我已经编辑了你的标题。请看“,”其中的共识是“不,他们不应该”。没问题。帮助别人接受你认为最适合你问题的答案。没问题。帮助他人接受你认为最适合你问题的答案。