繁体   English   中英

WPF:使用哪个收集类

[英]WPF: Which collection class to use

在花了一整天的时间尝试不同的建议之后,我回到了第1方块。我试图将我的视图(XAML窗口)绑定到我的ViewModel属性之一(例如SalesOrders)。 然后,ViewModel与模型(数据库顶部的EF模型)对话。 我面临的问题是我应该用来公开我的SalesOrders属性的集合类型。

我尝试了以下类型,但没有一种可以满足我的所有需求。

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

这是我需要收集的东西:

  1. 该视图具有“上一个/下一个”按钮,因此集合应提供某种货币管理器。
  2. 视图中有一个“保存”按钮,我需要根据SalesOrder集合是否进行任何更改立即启用/禁用该按钮。 由于SalesOrder已经是EF类型,因此其所有字段都实现INotifyPropertyChanged

CollectionViewSource为我提供了导航方法(上一个/下一个),但是不侦听PropertyChanged事件,因此在视图中修改数据不会打开“保存”按钮。 BindingList可以侦听PropertyChanged事件,但不提供导航方法。 ObservableCollection缺少这两种功能。

TIA。

根据MSDN关于CollectionView 在这里

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM