新 WPF 项目的 Prism 和 MVVM

Fla*_*ack 3 wpf prism mvvm

我很快就会开始一个新项目,并正在向那些有 WPF、Prism 和 MVVM 经验的人寻求一些架构建议。

该项目肯定是 WPF,我将实现 MVVM(我可能会使用 Josh Smith 的 MVVM 基金会作为起点),以便能够从 UI/逻辑分离等中受益。但我不确定我是否会这样做使用 Prism 来构建我的项目也能受益匪浅。

让我简单介绍一下这个项目。将有一个主“工具栏”,其中显示许多小部件。每个小部件都会显示一些与其功能相关的基本数据,单击该小部件将打开一个新窗口,该窗口将显示更详细的数据,并包含用于查看/编辑数据的丰富 UI。

现在,我在想我可以使用 Prism 来构建该项目,但我以前从未使用过它,并且不确定它是否适合我想要实现的目标。例如,我的“工具栏”是否是一个包含每个小部件将填充的区域的外壳?单击小部件时显示的每个新窗口是否也是具有自己的区域设置的自己的外壳?如果我可以获取工具栏和工具栏上的一个小部件的模式,我就可以为其余小部件复制它。

除了 Prism 之外,我还有一个关于如何针对某些数据编辑窗口实施 MVVM 的问题。假设我有一个显示一些数据的图表,用户可以直接单击/鼠标在图表上移动来编辑他看到的数据。所有数据都在模型中,视图模型通过绑定使数据可供视图使用。我的问题是,特定于该视图中图表的鼠标单击/移动事件将写入哪里?我们不想在视图的代码后面有太多/任何东西,并且我们不想在视图模型中包含 UI 事件处理程序,所以我不确定如何处理这种类型的场景。我知道命令是可能的答案,但我见过的 MVVM 示例通常显示简单按钮单击的示例命令。总体思路是一样的吗?

因此,如果有人对上述内容有任何建议或有关使用 WPF 和 MVVM/Prism 的任何一般提示,请告诉我。

谢谢。

aqw*_*ert 6

那里有一些问题,所以我会尽力回答所有问题。

我参与的项目包含 WPF、MVVM 和 Prism 以及其他框架。最好的建议是在将它们粘合在一起之前先了解它们的威力和功能。您不必使用 Prism 的所有功能即可在这种情况下发挥作用。

对于棱镜,您可以使用...

  1. Shell 和引导程序用于初始化应用程序并从其他程序集中加载模块。
  2. 创建并配置 Unity 以进行依赖注入。您可以使用其他 DI 容器。您可以在此处添加每个模块将使用的全局服务。
  3. 使用 EventAggregator 通知应用程序的不同部分,通常跨模块和视图
  4. 用于命名 UI 上区域的区域,以便模块可以将视图添加到特定位置。

上述 4 个并非都必须使用,但可以轻松集成到 MVVM /WPF 应用程序中。

例如,我的“工具栏”是否是一个包含每个小部件将填充的区域的外壳?

您可以在此处创建一个区域(可以从区域派生)来管理工具栏上的按钮。(我使用了关于功能区的区域)。服务可以通过一个接口公开,每个模块都可以提供命令/图像(无论你有什么),当单击它时将创建一个 ViewModel。您可以在模块的初始化中执行此操作。

单击小部件时显示的每个新窗口是否也是具有自己的区域设置的自己的外壳?

如果每个按钮都会打开一个全新的窗口,我建议引入一个通用控制器类,该类将创建一个通用窗口并附加一个您的模块创建的视图模型。在这种情况下,没有真正需要使用区域,除非您将不同的视图粘合到一个应用程序窗口,该窗口保持打开状态的时间比视图本身的生命周期长。基本形式的窗口可以简单地是这样的......

<Window ...>
  <ContentControl Content="{Binding}" />
</Window> 
Run Code Online (Sandbox Code Playgroud)

在你的控制器中的什么地方可以做到这一点......

public void DisplayView(ViewModel vm)
{
   var window = new MyWindow { DataContext = vm };
   window.Show();
}
Run Code Online (Sandbox Code Playgroud)

控制器可以直接在模块中使用,也可以直接包装在服务中......尽管为了可测试性,服务和接口是最好的。确保您已将模块资源与 合并,Applicaiton.Resources并使用DataTemplate来将视图链接到视图模型。

我的问题是,特定于该视图中图表的鼠标单击/移动事件将写入哪里?

不要害怕代码隐藏,但在这种情况下,您可以使用EventToCommand附加行为,该行为将路由到视图模型上的命令。MVVMLight工具包有这个,如果您愿意,您可以重用它。

DI 非常强大,即使没有 Prism,我也鼓励使用它,因为构建视图模型会更容易。

华泰