【发布时间】:2010-05-16 20:00:40
【问题描述】:
我认为我所做的事情完全符合 Josh Smith MVVM 手册,但是当视图模型中没有数据发生变化时,我似乎遇到了很多值转换器触发问题。
所以,我在 XAML 中定义了一个 ContentControl,如下所示:
<ContentControl Grid.Row="0" Content="{Binding CurrentViewModel}" />
包含此 ContentControl 的 Window 引用的资源字典如下所示:
<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事件。 - 在事件处理程序中,手动将
ContentControl的Content属性设置为适当的视图,基于CurrentViewModel(使用if语句)。
这似乎可行,但似乎也很不雅。我希望有更好的方法。
您能否告诉我处理视图切换的最佳方法,以免值转换器不必要地触发?
【问题讨论】:
标签: c# wpf silverlight xaml mvvm