我们开始在WPF中采用MVVM模式,到目前为止,我们已经将ViewModel与View分开,并且我们创建了Command
类。但在所有情况下,我们首先初始化View并在代码隐藏中生成ViewModel。我想它并没有探索MVVM的全部好处。例如,当一个新的UI组件应该由Command
生成时,我需要Command
混合ViewModel和View up,因为它需要知道两者并创建它们。没有明确的分离。
现在我还有另一个问题,我认为也可能与此问题有关:在WPF应用程序中,我们需要托管一个WCF服务,该服务从同一台机器中的另一个应用程序获取请求,并初始化相应的WPF控制。由于我们在非UI线程中托管服务(我们不希望主机位于UserControl
的代码隐藏中),因此无法生成UserControl
生成的ContentControl
托管线程。所以我想我现在必须初始化ViewModel,然后尝试解析相应的View。
在使用MEF作为依赖注入并使用EventAggregator通知生成新的ViewModel之前,我有一些经验。但由于它会给我们当前的项目带来很多变化,我想知道,我还有其他选择来解决这个问题吗?
到目前为止,我们的UI仍然非常简单,但从长远来看,我们需要创建一个复杂的UI。但另一个问题是:是否应始终使用MEF / Unity以便为复杂的UI采用MVVM模式?现在我觉得为了分离ViewModel和View,它们是必须的。我对么?
更新:
有些答案指向我,我可以简单地使用DataTemplate来告诉XAML如何渲染我的ViewModel。例如,我可以在一个主UserControl中声明ContentControl
(让我称之为UC_Host),它将根据ViewModel的类型选择View,并且Window
的DataContext绑定到我生成的ViewModel。据我所知,这是可行的,例如,如果我的UC_Host始终存在并且只有一个UC_Host可用于托管UC。
但是在我们的项目中,我们实际上想要在新的Window
中显示生成的UC,并且这些Windows
的数量不受限制(WPF和多窗口布局中仍然没有MDI)是我们目前解决某些任务的方法)。这意味着我们没有在新Window
之上使用统一的UC_Host,因此从那里绑定到ViewModel也不容易。
这就是为什么我正在寻求让我的MainView解析View的解决方案(因为只有在UI线程中它才能生成UIElement并在其代码隐藏中生成新的{{1}})。我猜不可能直接数据绑定
答案 0 :(得分:1)
由于您希望遵循MVVM,其中View位于最高级别,因此您不应在视图中放置任何代码(甚至不在构造函数中)。您在ViewModels中实现逻辑,创建Views以正确显示数据并让应用程序将它们绑定在一起。没关系,没有专用的主窗口,只要将DataTemplate -s合并到App.xaml中,就可以将DataTemplate -s放在App.xaml或任何其他资源中。在单独的窗口中显示UserControl与将它们显示为单独的选项卡没有太大区别。
如果你需要WPF的MDI,你可以使用这个:http://mdicontainer.codeplex.com。
答案 1 :(得分:0)
您可以使用DataTemplates:
<DataTemplate DataType="{x:Type local:ViewModelClass}">
<views:ViewClass />
</DataTemplate>
此模板可以声明为XAML资源。
<强>更新强> 在这种情况下,使用Unity并从后面的代码中解析您的视图模型不是更好吗?我实际上是这样做的,因为我的视图的容器不是ItemsControl:
public MyView(MyViewModel vm)
{
InitializeComponent();
DataContext = vm;
}
让Unity解析ViewModel。
答案 2 :(得分:0)
使用CaliburnMicro。使用 ViewModel第一个方法。
http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Conventions
基本上使用反射为每个 FooViewmodel
找到 FooView