是否存在一种MVVM友好的方式来交换视图,而无需使用值转换器进行不必要的引发?

是否存在一种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,这会导致异常,除非我专门检查了这一点。但我也有其他奇怪的副作用。

这我想知道如果我不应该只是做一切手动,像这样:

  1. 实例化每个视图。
  2. 将每个视图的DataContext设置为适当的视图模型。
  3. ContentControl一个名字并将其公开。
  4. 处理窗口的PropertyChanged事件。
  5. 在事件处理程序中,根据CurrentViewModel(使用if语句)手动将ContentControlContent属性设置为相应的视图。

这似乎工作,但它也似乎很不雅。我希望有更好的方法。

您能否告诉我处理视图切换的最佳方法,以便值转换器不会不必要地触发?

我通过摆脱所有IValueConverter和IMultiValueConverter类,并使用ViewModel提供所有数据来解决此问题。事实证明,这需要更少的代码和麻烦,并且不会牺牲任何我知道的东西。

你应该看看PRISM或其他任何复合的UI框架。棱镜会给你这种类型的东西很好的机制。