我是MVVM模式的新手,我正在尝试Caliburn.Micro项目。
我希望有一个由多个视图共享的ViewModel(包含ViewModel的集合),其中每个视图仅显示在其中一个属性上具有特定值的项目。
为了具体,我使用的服务允许我监视频繁更新的不同值。然后我得到一个MonitoredItem类型的对象,它包含一个DataValue
类型的属性,该属性又包含Value的对象和值的数据类型的属性。
到目前为止,我有一个MonitoredItemViewModel
使用此服务的MonitoredItem
类作为其模型,MonitoredItemsViewModel
包含BindableCollection<MonitoredItemViewModel>
MonitoredItems ,以及添加/删除项目的命令。
我还有一个MonitoredItemsView
,我可以看到我正在监控的所有项目。
我如何分割视图,以便我可以让MonitoredItems
所有DataValue
在我的窗口的一个区域中显示整数/浮点/双,布尔值显示在其他地方等等?
答案 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>
如果没有,那么你有几个选择。
CollectionChanged
进行通知,或者在项目属性也发生变化时收到通知。ItemViewModel
不可变,以便其属性永远不会更改,而是删除旧项目并将更新的项目添加到正确的集合中。