【问题标题】:WPF: Which collection class to useWPF:使用哪个集合类
【发布时间】:2013-03-08 17:32:02
【问题描述】:

花了一整天的时间尝试不同的建议后,我回到了第 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。

【问题讨论】:

  • 听起来你应该自己动手。
  • 当您添加到您的CollectionViewSource 时,您不能只连接到模型的PropertyChanged 事件并在删除时取消连接吗?然后,在 PropertyChanged 的​​处理程序中,重新查询保存按钮的命令(我假设它绑定到 ICommand
  • 为什么您的收藏need 这样做?这不就是 ViewModel 的用途吗?你总是可以滚动你自己的类来公开一个像@Will 建议的集合。
  • Ryan:视图不应该与模型对话,还是应该? Bob:经常需要一个真正的“可观察的集合”。毕竟,这就是我们在框架中拥有所有这些可绑定集合的原因。在 VM 中为每个集合类型属性手动执行此操作就像一次又一次地重新发明同一个轮子。正如 Will 所说,我最终创建了自己的 ObservableCollection。

标签: wpf mvvm binding observablecollection bindinglist


【解决方案1】:

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

【讨论】:

  • 阅读我的问题。 ObservableCollection 在其中一项更改(修改其属性之一)时不会引发 CollectionChanged。
  • @dotNET 请阅读第二部分“如果您需要跟踪集合中对象的更改,您必须构建一个扩展的 ObservableCollection....”
  • 啊,我明白了。这就是我最终的结果。所以从某种意义上说,这确实回答了这个问题。
【解决方案2】:

根据 MSDN 关于 CollectionView here:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-01-23
    • 2010-10-11
    • 2023-03-20
    • 2012-10-21
    • 2011-05-01
    • 1970-01-01
    • 2010-11-28
    • 2011-05-16
    • 1970-01-01
    相关资源
    最近更新 更多