【问题标题】:Should my ViewModel have an ObservableCollection of Views or ViewModels?我的 ViewModel 是否应该有一个 ObservableCollection 的 Views 或 ViewModels?
【发布时间】:2010-11-01 04:10:38
【问题描述】:

我试图通过 DataTemplates 将其绑定到 ViewModel 上的 ObservableCollections 来了解使用 ItemsControl 时的基本 MVVM 设计方法。

我见过绑定到 stringsViewsViewModels 的 ObservableCollections 的示例。

绑定到字符串似乎只适用于demos,它是绑定到“ViewModels that contains Views collection of Views of Views of ViewModels”,WPF的力量好像真的出来了。

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

  • 始终使用 ObservableCollection<...> 而从不使用 List<...> 因为...
  • 比 ItemsControl 更好地显示集合的是...
  • 为了让过滤器在您的 ViewModel 中而不是在代码隐藏中工作,请使用...
  • 在...时使用视图集合,在...时使用 ViewModel 集合
  • 90% 的时间我都会创建一个 ItemsControl 并将其绑定到具有自己的 ViewModel 的 ObservableCollection 视图...

【问题讨论】:

    标签: wpf mvvm observablecollection itemscontrol


    【解决方案1】:

    出于以下原因,我会使用 ViewModel 的 ObservableCollection:

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

    【讨论】:

    • +1,这绝对是要走的路。您的视图模型具有视图模型的集合,并且您的视图的资源集合具有每个视图模型的数据模板。
    【解决方案2】:

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

    【讨论】:

    • 如果您有 ViewModel(而不是 View)的 ObservableCollection,那么在 DataTemplate 中使用 XAML 与在 View 的 .xaml 文件中使用 XAML 有什么区别?
    【解决方案3】:

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

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

    【讨论】:

    • 是的,活动是最好的方式。考虑使用弱事件模式以确保安全。
    猜你喜欢
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 2017-11-06
    相关资源
    最近更新 更多