是否存在一种MVVM友好的方式来交换视图,而无需使用值转换器进行不必要的引发?
问题描述:
我以为我在做的是从Josh Smith MVVM手册中得到的,但当视图模型中没有数据发生变化时,我似乎遇到了很多值转换器触发的问题。是否存在一种MVVM友好的方式来交换视图,而无需使用值转换器进行不必要的引发?
所以,我在XAML中定义这样的ContentControl
:
<ContentControl Grid.Row="0" Content="{Binding CurrentViewModel}" />
包含此ContentControl
引用,看起来像这样的资源字典的窗口:
<ResourceDictionary ...>
<DataTemplate DataType="{x:Type lib_vm:SetupPanelViewModel}">
<lib_v:SetupPanel />
</DataTemplate>
<DataTemplate DataType="{x:Type lib_vm:InstructionsPanelViewModel}">
<lib_v:InstructionsPanel />
</DataTemplate>
</ResourceDictionary>
所以,基本上,两个数据模板指定哪个视图显示哪个视图模型。
只要窗口视图模型上的CurrentViewModel
属性发生更改,就会按预期方式切换视图,但即使没有数据更改,它也似乎会导致视图上的值转换器被触发。这是IMultiValueConverter
类的一个特殊问题,因为value
数组中的值设置为DependencyProperty.UnsetValue
,这会导致异常,除非我专门检查了这一点。但我也有其他奇怪的副作用。
这我想知道如果我不应该只是做一切手动,像这样:
- 实例化每个视图。
- 将每个视图的
DataContext
设置为适当的视图模型。 - 给
ContentControl
一个名字并将其公开。 - 处理窗口的
PropertyChanged
事件。 - 在事件处理程序中,根据
CurrentViewModel
(使用if
语句)手动将ContentControl
的Content
属性设置为相应的视图。
这似乎工作,但它也似乎很不雅。我希望有更好的方法。
您能否告诉我处理视图切换的最佳方法,以便值转换器不会不必要地触发?
答
我通过摆脱所有IValueConverter和IMultiValueConverter类,并使用ViewModel提供所有数据来解决此问题。事实证明,这需要更少的代码和麻烦,并且不会牺牲任何我知道的东西。
答
你应该看看PRISM或其他任何复合的UI框架。棱镜会给你这种类型的东西很好的机制。