我的ViewModel应该有Views或ViewModels的ObservableCollection吗?

11

我正在尝试理解使用 DataTemplates 通过ViewModel将 ItemsControl 绑定到 ObservableCollections 时基本的MVVM设计方法。

我看到一些绑定到 字符串视图视图模型 的 ObservableCollections 的例子。

绑定到字符串似乎只用于演示,而是将"包含视图模型集合的视图集合的视图模型的集合"绑定,WPF的威力似乎真正地展现出来了。

对于那些精通MVVM模式的人,您在绑定ItemsControl、ListView、ListBox到ViewModel中的集合时采用的标准方法是什么? 我正在寻求像这样的经验建议:

  • 始终使用ObservableCollection<...>而不是List<...>,因为...
  • 比ItemsControl更好地显示集合的方式是...
  • 为了使筛选在ViewModel中而不是在代码后端工作,使用...
  • 当...时使用视图的集合,当...时使用视图模型的集合
  • 90%的情况下,我创建一个ItemsControl,并将其绑定到一个具有自己的ViewModel的Views的ObservableCollection...
3个回答

10

我会使用一个 ViewModel 的 ObservableCollection,原因如下:

  • ObservableCollection 已经提供了用于通知集合已被修改的事件(例如当向集合中添加/删除项时)。
  • 我们处于 ViewModel '层',因此在 ViewModel 中包含 ViewModel 集合比包含 View 更加清晰分离。
  • 如果需要修改或获取集合内的项目数据,则如果这些项目是 ViewModels,则可以更轻松地修改/访问该数据(如果它们是 Views,则经常需要将 View 的 DataContext 强制转换或访问其 UI 元素)。

+1,这绝对是正确的方法。你的ViewModel拥有ViewModel集合,而你的View资源集合则为每个ViewModel提供了DataTemplate。 - Michael Edenfield

1
我喜欢使用 ViewModel 的 ObservableCollection。绑定到集合的视图可以定义一个 DataTemplate,为 ViewModel 提供它的外观。这样可以减少组件之间的耦合。

如果你有一个 ViewModel 的 ObservableCollection(而不是 View),那么在你的 DataTemplate 中拥有该 XAML 和在 View 的 .xaml 文件中拥有该 XAML 之间有什么区别? - Edward Tanguay

1

我有同样的问题,但是将“view”替换为“model”。:)

我有一个包含其他模型的MODEL。 我希望我的viewmodel具有其他viewmodel的可观察集合,但是一旦我像那样实例化它-模型集合内容之间的连接就会丢失。 现在我是否需要开始将viewmodels可观察集合中的所有事件连接回模型集合?


1
是的,事件是最好的方法。考虑使用弱事件模式来确保安全。 - Gusdor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接