组合式 WPF:数据模板 vs 视图模型注入

3
这里有一个简单的问题:你用什么来将你的视图链接到你的视图模型?
基本上有两种常见的方法来实现这个目标,数据模板和视图模型注入(如下所示)。
我想知道的是,为什么你更喜欢一种方法而不是另一种方法,在哪种情况下你使用它们。请说明你使用的MVVM框架。
数据模板方式或“视图模型优先”方法(Resources.xaml):
<DataTemplate DataType="{x:Type my:PersonViewModel}">
    <my:PersonView/>
</DataTemplate>

视图模型注入方式或“视图优先”方法(PersonView.xaml.cs):
[Import]
public PersonViewModel ViewModel
{
    set
    {
        this.DataContext = value;
    }
}
3个回答

11

我更喜欢使用DataTemplates

  • 因为它允许我基于一个属性为同一个ViewModel设置多个View

  • 我的ViewModel是我的应用程序,而View仅仅是一个美观的层,使我的ViewModel用户友好。如果我使用ViewModel注入,则View变成了我的应用程序,开发团队突然就需要担心UI方面的问题。

  • 我的ViewModel由其他ViewModel管理。例如,一个ViewModel可能包含一个在TabControl中显示的其他ViewModel集合。添加或关闭选项卡是在父ViewModel内完成的。这种情况不容易通过View控制应用程序状态来实现。

  • 我可以根据需要使用带参数的构造函数初始化不同的ViewModel,而不必使用通用的导入类型。

这只是一些原因......我确信还有其他原因,但现在想不起来了


@Ucodia 我通常使用PRISM,尽管有时我也会使用MVVM Light框架,因为它们的“RelayCommand”在命令的“CanExecute”参数更改时会引发PropertyChanged事件,而PRISM的“DelegateCommand”则不会。 - Rachel
好的,谢谢。那么你使用Prism的Region功能吗?因为这是Prism的一个非常有趣的功能,但它使用了一种“视图优先”的方法。 - Ucodia
@Ucodia 我偶尔会在应用程序外壳中使用它,但我不会超出那个范围。例如,我可能会有一个菜单区域和一个内容区域,因为我知道无论应用程序发生什么变化,这两个部分始终是静态的。 - Rachel
@Rachel:关于“我的视图模型是我的应用程序”的问题:您如何处理应用程序的主窗口和弹出窗口/对话框?据我所知,将视图模型显示在新窗口中需要类似于new Window() { Content = windowViewModel }.Show()这样的东西——那不会污染您的应用程序吗?因为它只应由视图模型组成。 - stakx - no longer contributing
1
@stakx 我不是很喜欢在WPF中使用多个窗口,通常会采用这种解决方案,其中我有像IsDialogOpenDialogContext这样的属性,用于告诉视图显示“弹出窗口”。但如果我遇到需要多个窗口或顶级对话框的情况,我可能会考虑编写一些处理应用程序窗口/对话框管理的服务。这通常是我看到的推荐解决方案。 - Rachel

0

我们采用视图模型优先的方法,因为我们发现在大型企业应用程序中更容易管理。我们使用Caliburn.Micro来处理视图位置和绑定。


0

我两种都用。对于小项目,我使用DataTemplates,但对于更大或团队项目,我们使用视图模型注入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接