【问题标题】:One ViewModel containing a collection of ViewModels, different Views depending on value of ViewModel property一个 ViewModel 包含一组 ViewModel,不同的 View 取决于 ViewModel 属性的值
【发布时间】:2013-08-08 15:18:42
【问题描述】:

我是 MVVM 模式的新手,正在一个项目中试用 Caliburn.Micro。

我想让一个 ViewModel(包含 ViewModel 的集合)由多个 View 共享,其中每个 View 只显示在其属性之一上具有特定值的项目。

具体来说,我正在使用一项服务,该服务允许我监控经常更新的不同值。然后我得到一个 MonitoredItem 类型的对象,它包含一个 DataValue 类型的属性,该属性又包含一个用于 Value 的对象和一个用于该值数据类型的属性。

到目前为止,我有一个 MonitoredItemViewModel 使用此服务的 MonitoredItem 类作为模型,还有一个 MonitoredItemsViewModel 包含 BindableCollection<MonitoredItemViewModel> MonitoredItems,以及用于添加/删除项目的命令。

我还有一个MonitoredItemsView 可以看到我当前正在监控的所有项目。

如何拆分视图,以便我可以拥有所有MonitoredItems,其中DataValue 是在窗口的一个区域中显示的整数/浮点数/双精度值,在其他位置显示布尔值等?

【问题讨论】:

    标签: c# .net wpf mvvm caliburn.micro


    【解决方案1】:

    不要在视图中这样做,而是根据您需要过滤的内容在 ViewModel 上公开不同的集合。

    这可以作为已知集合来完成,例如

    public ObservableCollection<MonitoredItemViewModel> ItemsWhereFooIsBar ...
    public ObservableCollection<MonitoredItemViewModel> ItemsWhereFooIsntBar ...
    

    或者您可以更通用地按需返回过滤后的集合

    public ObservableCollection<MonitoredItemViewModel> GetItems(Func<DataValue, bool> matches)
    {
       //Filter collection with 
       return ... allItems.Where(x=>matches(x))... ;
    }
    

    并通过调用

    GetItems(x=>x.Foo == Bar)
    

    您将遇到的问题是项目何时更改并且应该从一个集合切换到另一个集合。如果您使用ReactiveUI,这将非常容易,因为您可以使用 Rx 触发其内置的项目跟踪,也可以使用其.CreateDerivedCollection(...) 自动构建新集合(提示,提示:-))

    如果没有,那么您有几个选择。

    • 您可以从 ObservableCollection 派生一个类,以便在添加或删除新项目时通过 CollectionChanged 收到通知,或者在项目属性发生更改时也收到通知。
    • 或者您可以将 ItemViewModel 设置为不可变的,这样它的属性就不会改变,而是删除旧项目并将更新的项目添加到正确的集合中。

    【讨论】:

    • 我在 this answer 上列出了一些 ReactiveUI 的替代品。
    • 感谢您提出的解决我问题的建议方法。我会试试这个
    • @HappyNomad 谢谢,我会看看那些。很高兴知道您不必每次都重新发明轮子
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    相关资源
    最近更新 更多