问题 我的ViewModel应该有一个ObservableCollection视图还是ViewModels?


我试图在使用时理解基本的MVVM设计方法 ItemsControl的 通过绑定它 的DataTemplates 至 ObservableCollections 在ViewModel上。

我见过绑定到ObservableCollections的例子 字符串查看,和 的ViewModels

绑定到字符串似乎只是为了 演示,它是绑定到“包含View集合的ViewModel,其中包含ViewModel集合“WPF的力量似乎真的出来了。

对于那些精通MVVM模式的人来说,将ItemControl,ListView,ListBox绑定到ViewModel中的集合的标准方法是什么? 我正在寻找这样的经验建议:

  • 总是使用ObservableCollection <...>而永远不会列出<...>因为...
  • 比ItemsControl更好的东西来展示一个集合是......
  • 为了使过滤能够在ViewModel中工作而不是代码隐藏,请使用...
  • 当...时使用View集合和ViewModels集合时......
  • 90%的时间我创建一个ItemsControl并将其绑定到具有自己的ViewModels的ObservableCollection视图...

1110
2018-06-08 12:45


起源



答案:


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

  • ObservableCollection已经具有可用于在其被修改时发信号的事件(例如,当从集合中添加/移除项目时)。
  • 我们在ViewModel'层',因此它提供了更清晰的分离,使ViewModel包含ViewModel而不是Views的集合
  • 如果需要修改或从集合中的项目获取数据,如果项目是ViewModel,则可以更轻松地修改/访问该数据(如果它们是视图,您将经常投射View的DataContext或访问其UI元素)。

10
2018-06-10 19:12



很有帮助,谢谢 - Edward Tanguay
+1,这绝对是要走的路。您的viewmodel具有视图模型的集合,并且您的视图的资源集合具有每个视图模型的数据窗口。 - Michael Edenfield


答案:


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

  • ObservableCollection已经具有可用于在其被修改时发信号的事件(例如,当从集合中添加/移除项目时)。
  • 我们在ViewModel'层',因此它提供了更清晰的分离,使ViewModel包含ViewModel而不是Views的集合
  • 如果需要修改或从集合中的项目获取数据,如果项目是ViewModel,则可以更轻松地修改/访问该数据(如果它们是视图,您将经常投射View的DataContext或访问其UI元素)。

10
2018-06-10 19:12



很有帮助,谢谢 - Edward Tanguay
+1,这绝对是要走的路。您的viewmodel具有视图模型的集合,并且您的视图的资源集合具有每个视图模型的数据窗口。 - Michael Edenfield


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


1
2018-06-08 14:53



如果您有一个ViewModel的ObservableCollection(而不是Views),那么在DataTemplate中使用XAML和将XAML作为View的.xaml文件之间的区别是什么? - Edward Tanguay


我有同样的问题,但用“模型”替换“视图”。 :)

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


1
2018-06-30 09:53



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