0

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

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

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

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

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

如何拆分视图,以便我可以MonitoredItemsDataValue窗口的一个区域中显示整数/浮点数/双精度,在其他地方显示布尔值等?

4

1 回答 1

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(...)自动构建新集合(提示,提示 :-))

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

  • 您可以从 ObservableCollection 派生一个类,以便CollectionChanged在添加或删除新项目时收到通知,或者在项目的属性更改时也收到通知。
  • 或者您可以使您的ItemViewModel不可变,使其属性永远不会改变,而是您删除旧项目并将更新的项目添加到正确的集合中。
于 2013-08-07T10:26:26.413 回答