同一ViewModel的多个视图

时间:2017-09-23 05:15:25

标签: mvvmcross

我们说我有一堆小猫。也许我有一个KittenViewModel。我想在卡片视图中将其显示为小猫卡片,但也可以在列表视图中分解为列。 MvvmCross是否支持将KittenViewModel绑定到多个视图?我应该有多个ViewModel引用回一个模型吗?

1 个答案:

答案 0 :(得分:0)

免责声明:我知道我正在回答一个您可能已经忘记的老问题;这是给后代的。另外,我对MVVM设计模式的了解有限。我记得在某个地方读过Views和ViewModels通常是一对一的对应关系,因此常规答案可能是“您不应该这样做。请重新考虑您的设计。”

话虽如此,我最近在这个问题上苦苦挣扎了一段时间,然后提出了一个非常简单的解决方案,该解决方案可以在以下假设下运行:(1)您希望在两个单独的视图中使用完全相同的ViewModel实例; (2)无论出于何种原因,您都不能使用DataTemplateSelector来确定要使用哪个视图; (3)您不介意为同一个ViewModel创建多个视图。

解决方案是为KittenViewModel定义单独的数据模板,作为要用于显示数据的任何控件的资源。例如,如果您创建了KittenCardView用户控件并打算将其显示在ContentControl中,则可以在DataTemplate资源中设置ContentControl,例如:< / p>

<ContentControl>
    <Control.Resources>
        <DataTemplate DataType="{x:Type viewmodel:KittenViewModel}">
            <view:KittenCardView/>
        </DataTemplate>
    </Control.Resources>
</ContentControl>

KittenColumnView(或您所说的任何东西)将以类似的方式处理。如果通常将其中一个视图仅在特殊情况下需要使用另一个视图,则可能会发现将其中一个视图定义为窗口或应用程序资源很有帮助。