Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复合WPF:数据模板与视图模型注入_Wpf_Mvvm_Dependency Injection_Datatemplate - Fatal编程技术网

复合WPF:数据模板与视图模型注入

复合WPF:数据模板与视图模型注入,wpf,mvvm,dependency-injection,datatemplate,Wpf,Mvvm,Dependency Injection,Datatemplate,这里有一个简单的问题:您使用什么将视图链接到视图模型 基本上有两种实现方法,数据模板和视图模型注入(下面的示例) 我想知道的是,为什么你更喜欢一种方法而不是另一种,在这种情况下,你会使用它们。精确使用MVVM框架。 数据模板方法或“视图模型优先”方法(Resources.xaml): 我们使用视图模型优先的方法,因为我们发现它更容易管理,特别是在更大规模的企业应用程序上。我们通常负责视图位置和绑定。我两者都使用。数据模板用于小型项目,但对于大型项目或团队项目,我们使用视图模型注入。我更喜欢使用

这里有一个简单的问题:您使用什么将视图链接到视图模型

基本上有两种实现方法,数据模板和视图模型注入(下面的示例)

我想知道的是,为什么你更喜欢一种方法而不是另一种,在这种情况下,你会使用它们。精确使用MVVM框架。


数据模板方法或“视图模型优先”方法(Resources.xaml):


我们使用视图模型优先的方法,因为我们发现它更容易管理,特别是在更大规模的企业应用程序上。我们通常负责视图位置和绑定。

我两者都使用。数据模板用于小型项目,但对于大型项目或团队项目,我们使用视图模型注入。

我更喜欢使用数据模板

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

  • 我的ViewModels是我的应用程序,而视图只不过是一个漂亮的图层,它使我的ViewModel的用户友好。如果我使用ViewModel注入,那么视图就会变成我的应用程序,开发团队突然不得不担心UI方面的问题

  • 我的ViewModels由其他ViewModels管理。例如,一个ViewModel可能包含在选项卡控件中显示的其他ViewModel的集合。添加或关闭选项卡是在父视图模型中完成的。使用视图控制应用程序状态,这类事情不容易完成

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


这只是几个原因。。。我肯定还有其他人,但他们现在不在我的脑海中

@Ucodia我通常使用PRISM,尽管我有时使用MVVM Light框架,因为当
可以执行
参数更改时,他们的
RelayCommand
会在命令上引发PropertyChanged事件,PRISM的
DelegateCommand
则不会。好的,谢谢。那么你使用棱镜的区域特征吗?因为这是Prism的一个非常有趣的特性,但是这个特性使用了一种“视图优先”的方法。@Ucodia我偶尔在应用程序外壳中使用它,但除此之外我不使用它。例如,我可能有一个菜单区域和一个内容区域,因为我知道无论应用程序发生什么,这两个部分都将始终保持不变static@Rachel:关于“我的ViewModels是我的应用程序”的一个问题:如何处理应用程序的主窗口和弹出窗口/对话框?据我所知,在新窗口中显示视图模型需要类似于
newwindow(){Content=windowViewModel}.Show()
--这不会污染你的应用程序,因为它应该只包含视图模型?@stakx我不太喜欢WPF中的多个窗口,通常情况下,我对解决方案很满意,例如,我有
IsDialogOpen
DialogContext
等属性来告诉视图显示“弹出窗口”。但如果我遇到需要多个窗口或顶级对话框的情况,我可能会考虑编写某种服务来处理应用程序的窗口/对话框管理。这通常是我看到的针对这些情况的建议。
<DataTemplate DataType="{x:Type my:PersonViewModel}">
    <my:PersonView/>
</DataTemplate>
[Import]
public PersonViewModel ViewModel
{
    set
    {
        this.DataContext = value;
    }
}