MVVM设计 - 处理多个视图的常见ViewModel

时间:2013-03-23 17:57:00

标签: wpf mvvm

在我的场景中,我有很多视图(UserControls),其中包含一些过滤器选项。让我们举例说,共有10个过滤器选项,但并非所有视图都显示所有10个过滤器选项。其中一些只显示3,其中一些只显示8,等等。重要的是,当在一个视图上设置一个过滤器选项时,包含此过滤器选项的所有视图应具有相同的值。

AView: filterOption1, FilterOption2, FilterOption3
BView: filterOption1, FilterOption3, FilterOption5
CView: filterOption2, FilterOption4, FilterOption6, FilterOption7

当用户在AView上设置filterOption1 = True时,应在使用filterOption1(ex BView)的所有视图上设置相同的值。这导致我决定使用一个CommonViewModel(单例),它将包含公共(共享)数据,并将公开其中的所有过滤器选项,并且所有视图都应该绑定到此CommonViewModel。

为了显示特定视图的过滤器选项,我可以考虑两种方法:

1)设计ONE CommonView,为每个表示创建新实例,并隐藏不需要的过滤器选项

<DataTemplate DataType="vm:CommonViewModel">
  <vw:CommonView ShowFilterOption1="True" ShowFilterOption3="True" />
</DataTemplate>

2)为每个不同的表示设置单独的视图(不同的过滤器选项)

您如何看待这些方法,您更喜欢哪种方法,您是否有其他想法,以及遵循适当的MVVM设计的最佳选择?

2 个答案:

答案 0 :(得分:1)

n绑定到一个viewmodel的视图,一旦viewmodel中的属性更改了视图,应该update = binding twoways到该属性

1)包含所有过滤器选项的一个视图意味着您将需要自定义逻辑来仅显示您希望看到的过滤器选项。 =绑定到可见性

2)对于过滤器选项的每个不同表示的单独视图也是可能的,但是我只会在每个单独的视图包含一些额外的控件或逻辑使得每个单独的视图以某种方式独特地使用1)时执行此操作。

答案 1 :(得分:0)

对我来说,这种逻辑 - 是否将特定的filterOption包含到视图中,实际上属于视图模型,而不是视图。 我会考虑实现一个视图,并为A,B,C中的每一个分离视图模型实例。视图模型可以是一个类,它将通过它将显示的filterOptions进行参数化。