Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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
依赖解析程序(MEF/Unity)是从WPF中的ViewModel解析视图的唯一方法吗?_Wpf_Mvvm_Dependency Injection_Mef - Fatal编程技术网

依赖解析程序(MEF/Unity)是从WPF中的ViewModel解析视图的唯一方法吗?

依赖解析程序(MEF/Unity)是从WPF中的ViewModel解析视图的唯一方法吗?,wpf,mvvm,dependency-injection,mef,Wpf,Mvvm,Dependency Injection,Mef,我们开始在WPF中采用MVVM模式,到目前为止,我们已经将ViewModel与View分离,并创建了命令类。但在所有情况下,我们首先初始化视图,然后在代码中生成ViewModel。我想它没有充分挖掘MVVM的好处。例如,当一个新的UI组件应该由命令生成时,我建议命令将ViewModel和View向上混合,因为它需要知道并创建这两个组件。没有明确的区分 现在我遇到了另一个问题,我认为这也可能与这个问题有关:在WPF应用程序中,我们需要托管一个WCF服务,它接收来自同一台机器中不同应用程序的请求,并

我们开始在WPF中采用MVVM模式,到目前为止,我们已经将ViewModel与View分离,并创建了
命令
类。但在所有情况下,我们首先初始化视图,然后在代码中生成ViewModel。我想它没有充分挖掘MVVM的好处。例如,当一个新的UI组件应该由
命令生成时,我建议
命令将ViewModel和View向上混合,因为它需要知道并创建这两个组件。没有明确的区分

现在我遇到了另一个问题,我认为这也可能与这个问题有关:在WPF应用程序中,我们需要托管一个WCF服务,它接收来自同一台机器中不同应用程序的请求,并初始化相应的WPF控件。由于我们在非UI线程中托管服务(我们不希望主机位于
UserControl
的代码隐藏中),因此在托管线程中无法生成生成的
UserControl
。所以我想现在我必须初始化ViewModel,然后尝试解析相应的视图

在使用MEF作为依赖项注入和使用EventAggregator生成新的ViewModel方面,我有一些经验。但是,由于它将给我们当前的项目带来许多变化,我想知道,我是否有其他选择来解决这个问题

到目前为止,我们的UI仍然非常简单,但从长远来看,我们需要创建一个复杂的UI。但另一个问题是:是否应该始终使用MEF/Unity,以便为复杂的UI采用MVVM模式?现在我觉得为了分离ViewModel和View,它们是必须的。我说得对吗

更新:

一些答案向我指出,我可以简单地拥有一个数据模板,它告诉XAML如何呈现我的ViewModel。例如,我可以在主用户控件(我称之为UC_主机)中声明一个
ContentControl
,它将根据ViewModel的类型选择视图,并且
ContentControl
的DataContext绑定到我生成的ViewModel。据我所知,这是可行的,例如,如果我的UC_主机始终存在,并且只有一个UC_主机可用于承载UC

但在我们的项目中,我们实际上希望在新的
窗口
中显示生成的UC,并且这些
窗口
的数量不受限制(WPF中仍然没有MDI,多窗口布局是我们当前对某些任务的解决方案)。这意味着在新的
Windows
上没有占主导地位的uniqie UC_主机,因此从那里绑定到ViewModel也不容易


这就是为什么我在寻找解决方案,让我的MainView解析视图(因为只有在UI线程中,它才能生成UIElement并生成一个新的
窗口
,可能在它的代码隐藏中)。直接数据绑定是不可能的,我想您可以使用数据模板:

<DataTemplate DataType="{x:Type local:ViewModelClass}">
    <views:ViewClass />
</DataTemplate>

让Unity来解析ViewModel。

因为您希望遵循MVVM,其中视图处于最高级别,所以您不应该在视图中放置任何代码(甚至不在构造函数中)。在ViewModels中实现逻辑,创建视图以正确显示数据,并让应用程序将它们绑定在一起。这并不重要,因为您没有专用的主窗口,只要将DataTemplate-s合并到App.xaml中,您就可以将其放在App.xaml或任何其他资源中。在单独的窗口中显示用户控件与将它们显示为单独的选项卡没有太大区别


如果您需要WPF的MDI,可以使用此MDI:

使用CaliburnMicro。使用视图模型优先方法


基本上使用反射来查找每个FooViewmodel

视图模型的FooView创建用户控件不是MVVM。您将绑定到由VM属性公开的模型,并使用DataTemplates根据模型类型使用控件填充UI。如果您使用INPC属性,您可以跨线程访问VM属性,而无需担心。感谢您的回复。但是我有一个问题,因为我们实际上想要在新的窗口中显示新生成的UserControl。请参阅我的更新,以了解更多详细信息
public MyView(MyViewModel vm)
{
    InitializeComponent();
    DataContext = vm;
}