【问题标题】:Is there an MVVM-friendly way to swap views without value converters firing unnecessarily?是否有一种 MVVM 友好的方式来交换视图而不会不必要地触发值转换器?
【发布时间】: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,这会导致异常,除非我特别检查。但我也得到了其他奇怪的副作用。

这让我想知道我是否不应该像这样手动完成所有事情:

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

这似乎可行,但似乎也很不雅。我希望有更好的方法。

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

【问题讨论】:

    标签: c# wpf silverlight xaml mvvm


    【解决方案1】:

    您应该查看 PRISM 或任何其他复合 UI 框架。 Prism 将为您提供处理此类事情的绝佳机制。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2010-11-25
        • 2017-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多