【问题标题】:MVVM: CollectionView in ViewModel or CollectionViewSource in xaml?MVVM:ViewModel 中的 CollectionView 或 xaml 中的 CollectionViewSource?
【发布时间】:2010-11-02 00:48:45
【问题描述】:

我正在使用 MVVM 模式开发 WPF 应用程序,我需要在 ListView 中显示项目列表(带有过滤功能),所选项目的字段显示在主/详细视图中。我在以下两种方式之间纠结:

  1. 在我的 ViewModel 中公开一个 CollectionView,并绑定到这个。
  2. 在我的 ViewModel 中公开一个普通的 IList,并使用 CollectionViewSource 在 XAML 中创建 CollectionView。

是否有一种公认的方式来做到这一点?对最好的方法有什么想法吗?

【问题讨论】:

  • 令人惊讶的是,很多时候你发现有人已经做了与你要问的完全相同的问题。谢谢! :)

标签: wpf collections mvvm


【解决方案1】:

我做前者(从 VM 中公开 CollectionView),但真正重要的是您的过滤逻辑在哪里。即使视图必须将CollectionViewSource 连接到VM,这绝对应该在VM 中进行测试。也就是说,我认为从 VM 中公开 CollectionView 并没有什么特别讨厌或反 MVVM 的地方。

【讨论】:

  • 同意 Kent,在 VM 中定义,以便对其进行测试。标记
  • 你只是在ViewModel中新建一个CollectionView吗? CollectionView 的 MSDN 说你不应该创建一个新的 CollectionView 而是创建一个 CollectionViewSource 并获取默认视图。创建 CollectionView 的最佳方式是什么?
  • +1。如果有人感兴趣,Microsoft PRISM 开发人员指南在第 79 页上推荐了同样的方法。
  • 我不喜欢在这种方法中从 ViewModels dll 中引用 WindowsBase 和 PresentationFramewrok dll,是否有任何解决方法可以在不引用此 dll 的情况下公开视图?
  • 为了避免从 ViewModel 引用 WPF dll,ICollectionView 接口 (System.ComponentModel) 可以在没有 WindowsBasePresentationFramework.dll 的情况下使用。要从您的ObservableCollection<T> 创建一个ICollectionView,请使用myCollectionView = CollectionViewSource.GetDefaultView(myObservableCollection),然后在XAML 中设置您的绑定,<DataGrid ... ItemsSource="{Binding myCollectionView, Mode=OneWay, ..."} ...></DataGrid >msdn.microsoft.com/en-us/library/…@ArsenMkrtchyan
【解决方案2】:

我知道我回答你的问题有点晚了,但我今天才看到。

我创建了使用 CollectionViewSource 的主视图/详细视图模型,并在博客中介绍了它。

我在这里写了一个关于主/明细表的视图模型,它使用: http://reyntjes.blogspot.com/2009/04/master-detail-viewmodel_24.html

您还可以在我的博客页面上找到 observablecollection 类的视图模型。

也许你觉得它对你有用。

【讨论】:

    猜你喜欢
    • 2013-09-18
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 2017-01-23
    • 2011-03-01
    • 2017-02-25
    相关资源
    最近更新 更多