Prism和MVVM用于新的WPF项目

3
我很快将开始一个新项目,希望从那些有WPF、Prism和MVVM经验的人士那里得到一些架构建议。
这个项目肯定是使用WPF,并且我将采用MVVM(我可能会使用Josh Smith的MVVM Foundation作为起点),以便能够从UI/逻辑分离等方面受益。但是,我不确定是否还应该使用Prism来构建我的项目。
让我简要描述一下这个项目。将有一个主要的“工具栏”,它将显示多个小部件。每个小部件都显示与其功能相关的一些基本数据,并且单击小部件将打开一个新窗口,其中将显示更详细的数据并包含用于查看/编辑数据的丰富UI。
现在,我想可以使用Prism来组织整个项目,但我以前从未使用过它,并不确定它是否适合我想要实现的目标。例如,我的“工具栏”是否应该是一个包含每个小部件所填充的区域的外壳?每次单击小部件时显示的每个新窗口是否也应该是具有自己的区域设置的外壳?如果我能够掌握工具栏和一个小部件的模式,我就可以复制它来处理其余的小部件。
除了Prism之外,我还有一个关于如何实现某些数据编辑窗口的MVVM的问题。假设我有一个图表,显示了一些数据,并且用户能够直接点击/鼠标移动到图表上以编辑他所看到的数据。所有数据都在模型中,视图模型通过绑定将该数据提供给视图。我的问题是,特定于该视图中的图表的鼠标单击/移动事件应写在哪里?我们不希望在视图的代码后台中添加太多/任何内容,也不希望在视图模型中具有UI事件处理程序,因此我不确定如何处理这种类型的情况。我知道命令可能是答案,但我看到的MVVM示例通常仅显示用于简单按钮单击的示例命令。总体思路是否相同?
因此,如果有人对上述或任何关于使用WPF和MVVM/Prism的一般提示有建议,请告诉我。
谢谢。

本文使用MEF而非Prism,但在处理IoC相关内容时,对于WPF和MVVM有一些有趣的想法:http://www.codeproject.com/KB/WPF/SoapBoxCorePinBallDemo.aspx - Scott Whitlock
2个回答

5

这里有几个问题,我会尽力回答。

我曾经参与一个项目,其中使用了WPF、MVVM和Prism等框架。最好的建议是在将它们综合在一起之前,先了解每个框架的功能和作用。在这种情况下,您不必使用Prism的所有功能才能发挥其作用。

对于Prism,您可以使用以下内容...

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

以上4个内容并不都需要使用,但可以很容易地集成到MVVM/WPF应用程序中。

例如,我的“工具栏”是否应该是 包含每个小部件填充的区域的shell?

在这里,您可以创建一个区域(您可以从Region派生),它将管理工具栏上的按钮。(我在Ribbon方面使用过区域)。可以通过接口公开服务,每个模块都可以提供命令/图像(您拥有的任何内容),当单击时将创建一个ViewModel。您可以在模块的初始化中执行此操作。

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

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

<Window ...>
  <ContentControl Content="{Binding}" />
</Window> 

在您的控制器中,可以在哪里实现这个功能...

public void DisplayView(ViewModel vm)
{
   var window = new MyWindow { DataContext = vm };
   window.Show();
}

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

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

不要害怕代码后台,但在这种情况下,您可以使用EventToCommand附加行为,它将路由到您的视图模型上的命令。如果您想要重用,则MVVMLight工具包中有此功能。
DI非常强大,我鼓励即使没有Prism也使用它,因为构建您的视图模型将更容易。
希望这可以帮助。

感谢您提供的信息和建议。非常感激。 - Flack

1

我认为Prism对你来说非常适合。

->我的“工具栏”是否是一个包含每个小部件的区域的外壳?

  1. 在Shell中放置一个带有ItemsControl的单个区域
  2. 为每个小部件创建模块
  3. 继续将小部件模块添加到同一itemscontrol shell区域中。

这样做的最大优点是,如果您添加更多模块,您不需要更改任何内容。

->当单击小部件时显示的每个新窗口也会成为其自己的外壳,并设置自己的区域吗?

不,您可以在Shell中使用“WindowRegionAdapter”为小部件创建视图以在单独的窗口中显示。

->那么特定于该视图中的图表的鼠标单击/移动事件将在哪里编写?

您可以使用附加行为仅在XAML中将视图中的事件绑定到ViewModel中的命令。搜索“Blend behaviors”或“attached bahaviors”了解如何执行此操作。无需编写任何代码即可完成此操作。

老实说,我只是想给您提供关键字,以便您搜索获取所需的所有信息。


谢谢。我会再搜索一些额外的信息。 - Flack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接