1

在花了一整天尝试不同的建议之后,我回到了第 1 点。我试图将我的视图(XAML 窗口)绑定到我的一个 ViewModel 属性,比如 SalesOrders。ViewModel 反过来与 Model(数据库顶部的 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。

4

2 回答 2

0

根据 MSDN 关于 CollectionView这里

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

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

myCollectionView = (BindingListCollectionView)CollectionViewSource.GetDefaultView(this.SalesOrders);
于 2013-03-09T09:42:03.623 回答
0

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

于 2013-03-09T13:19:50.343 回答