我正在编写一个从本地数据库读取数据并将其显示在列表框中的应用程序(我在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属性也反映了这些更改。
为什么会出现这种情况? 对我来说没关系,但我无法理解为什么会这样。是因为通知吗?
答案 0 :(得分:1)
属性Collection对ObservableDVD的视图有reference。作为参考意味着指向内存中的相同数据。
ObservableCollection Class表示动态数据集合,在添加,删除项目或刷新整个列表时提供通知。
答案 1 :(得分:0)
您指定的集合只是ObservableDVD集合的“视图”。这意味着两者都指向内存中的相同数据,它们不是两个独立的东西。例如,当您将过滤器应用于集合时,“视图”可以是项目的子集。
否则说,您的ObservableDVD包含整个数据集的“数据表”,而ICollectionView允许您通过自定义逻辑操纵用户可以看到哪些记录/对象。