一个ViewModel包含ViewModel的集合,不同的View取决于ViewModel属性的值

时间:2013-08-07 09:49:07

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

我是MVVM模式的新手,我正在尝试Caliburn.Micro项目。

我希望有一个由多个视图共享的ViewModel(包含ViewModel的集合),其中每个视图仅显示在其中一个属性上具有特定值的项目。

为了具体,我使用的服务允许我监视频繁更新的不同值。然后我得到一个MonitoredItem类型的对象,它包含一个DataValue类型的属性,该属性又包含Value的对象和值的数据类型的属性。

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

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

我如何分割视图,以便我可以让MonitoredItems所有DataValue在我的窗口的一个区域中显示整数/浮点/双,布尔值显示在其他地方等等?

1 个答案:

答案 0 :(得分:0)

请勿在视图中执行此操作,而是根据您需要过滤的内容在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(...)自动构建新集合(提示,提示: - ))< / p>

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

  • 您可以从ObservableCollection派生一个类,以便在添加或删除新项目时通过CollectionChanged进行通知,或者在项目属性也发生变化时收到通知。
  • 或者您可以使ItemViewModel不可变,以便其属性永远不会更改,而是删除旧项目并将更新的项目添加到正确的集合中。