0

我们开始在 WPF 中采用 MVVM 模式,到目前为止,我们已经将 ViewModel 从 View 中分离出来,并且我们已经创建了Command类。但在所有情况下,我们首先初始化 View 并在代码隐藏中生成 ViewModel。我想它并没有探索 MVVM 的全部好处。例如,当一个新的 UI 组件应该由 a 生成时Command,我认为CommandViewModel 和 View 混合在一起,因为它需要知道两者并创建它们。没有明确的区分。

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

在使用 MEF 作为依赖注入和使用 EventAggregator 来通知新 ViewModel 的生成之前,我有一些经验。但既然它会给我们当前的项目带来很多变化,我想知道,我还有其他选择来解决视图吗?

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

更新:

一些答案指向我,我可以简单地拥有一个 DataTemplate,它告诉 XAML 如何呈现我的 ViewModel。比如我可以在一个ContentControl主UserControl中声明一个(我叫它UC_Host),它会根据ViewModel的类型来选择View,并且它的DataContextContentControl是绑定到我生成的ViewModel上的。据我了解,这是可行的,例如,如果我的 UC_Host 始终存在并且只有一个 UC_Host 可用于托管 UC。

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

这就是为什么我正在寻找让我的 MainView 解析视图的解决方案(因为只有在 UI 线程中它才能生成 UIElement 并Window可能在其代码隐藏中生成一个新元素)。我想直接数据绑定是不可能的

4

3 回答 3

1

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

如果你需要 WPF 的 MDI,你可以使用这个: http: //mdicontainer.codeplex.com

于 2013-11-20T13:09:19.360 回答
0

您可以使用数据模板:

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

此模板可以声明为 XAML 资源。

更新: 在这种情况下,使用 Unity 并从后面的代码中解析视图模型不是更好吗?对于我的视图容器不是 ItemsControl 的情况,我实际上是这样做的:

public MyView(MyViewModel vm)
{
    InitializeComponent();
    DataContext = vm;
}

并让 Unity 解析 ViewModel。

于 2013-09-12T15:52:42.233 回答
0

使用 CaliburnMicro。使用ViewModel 第一种方法。

http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Conventions

基本上使用反射为每个FooViewmodel找到FooView

于 2013-11-20T13:28:40.750 回答