WPF:要使用哪个集合类

WPF:要使用哪个集合类,wpf,mvvm,binding,observablecollection,bindinglist,Wpf,Mvvm,Binding,Observablecollection,Bindinglist,在花了一整天的时间尝试不同的建议后,我又回到了起点。我试图将我的视图(一个XAML窗口)绑定到我的一个ViewModel属性,比如SalesOrders。ViewModel依次与模型(数据库顶部的EF模型)对话。我面临的问题是我应该使用哪种集合类型来公开我的SalesOrders属性 我试过以下几种,没有一种能满足我的需要 列表 observedcollection BindingList CollectionViewSource位于上面的顶部 以下是我需要收藏的东西: 视图有上一个/下一个按钮

在花了一整天的时间尝试不同的建议后,我又回到了起点。我试图将我的视图(一个XAML窗口)绑定到我的一个ViewModel属性,比如SalesOrders。ViewModel依次与模型(数据库顶部的EF模型)对话。我面临的问题是我应该使用哪种集合类型来公开我的SalesOrders属性

我试过以下几种,没有一种能满足我的需要

  • 列表
  • observedcollection
  • BindingList
  • CollectionViewSource
    位于上面的顶部
  • 以下是我需要收藏的东西:

  • 视图有上一个/下一个按钮,因此集合应该提供某种货币管理器
  • 视图中有一个保存按钮,我需要根据SalesOrder集合是否有任何更改立即启用/禁用该按钮。由于
    SalesOrder
    已经是EF类型,因此其所有字段都实现
    INotifyPropertyChanged
  • CollectionViewSource
    为我提供了导航方法(上一个/下一个),但不侦听PropertyChanged事件,因此修改视图中的数据不会打开“保存”按钮<代码>绑定列表可以侦听PropertyChanged事件,但不提供导航方法
    ObservableCollection
    缺少这两种功能


    TIA.

    根据MSDN关于CollectionView的内容:

    在WPF应用程序中,所有集合都有一个关联的默认值 集合视图。与直接使用集合不同的是 绑定引擎始终通过关联的 看法要获取默认视图,请使用 CollectionViewSource.GetDefaultView方法。基于的内部类 CollectionView是仅实现的集合的默认视图 我数不清。ListCollectionView是集合的默认视图 这是IList。BindingListCollectionView是默认视图 用于实现IBindingListView或IBindingList的集合

    这意味着您可以将BindingList用于SalesOrders并将其绑定到视图中,然后为了管理导航,您可以使用以下命令从ViewModel访问其自动创建的CollectionView:

    myCollectionView = (BindingListCollectionView)CollectionViewSource.GetDefaultView(this.SalesOrders);
    

    为什么不使用
    ObservableCollection
    然后订阅
    CollectionChanged
    事件,以启用或禁用线程答案中概述的保存按钮。

    听起来你应该自己启动。在添加到应用程序时,你能不能直接连接到模型的
    PropertyChanged
    事件
    CollectionViewSource
    并在删除时取消挂钩?然后,在PropertyChanged的处理程序中,重新查询save按钮的命令(我假设它绑定到
    ICommand
    ),为什么集合
    需要这样做?这不是ViewModel的用途吗?你总是可以滚动你自己的类来公开一个集合,比如@Will suggered。Ryan:视图不应该与模型对话,还是应该?鲍勃:经常需要有一个真正的“可观察的集合”。毕竟,这就是为什么我们在框架中有所有这些可绑定的集合。在VM中为每个集合类型属性手动执行此操作就像一次又一次地重新发明同一个轮子。正如威尔所说,我最终创建了自己的可观察集合。阅读我的问题。ObservableCollection中的一个项目发生更改(修改其属性之一)时不会引发CollectionChanged。@dotNET请阅读第二部分,其中说“如果需要跟踪集合中对象的更改,则必须构建扩展的ObservableCollection…”啊,我明白了。这就是我的结局。所以在某种意义上,这确实回答了这个问题。