WPF:要使用的集合类

时间:2013-03-08 17:32:02

标签: wpf mvvm binding observablecollection bindinglist

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

我尝试了以下类型,但没有一种能满足我的需要。

  1. List<T>
  2. ObservableCollection<T>
  3. BindingList<T>
  4. CollectionViewSource在上面的
  5. 之上

    这就是我需要收集的内容:

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

      TIA。

2 个答案:

答案 0 :(得分:0)

根据MSDN关于CollectionView here

  

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

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

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

答案 1 :(得分:0)

为什么不使用ObservableCollection<T>然后订阅CollectionChanged事件来启用或停用保存按钮,如线程MVVM ObservableCollection Bind TwoWay的答案中所述。