Prism和MVVM用于新的WPF项目

问题描述:

我将很快开始一个新项目,并正在寻找来自WPF,Prism和MVVM经验的您的建议。Prism和MVVM用于新的WPF项目

该项目肯定是WPF,我将实施MVVM(我可能会使用Josh Smith的MVVM Foundation作为起点),以便能够从UI /逻辑等的分离中受益。我不确定尽管如果我也能从使用棱镜来构建我的项目。

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

现在,我想我可以使用棱镜框架项目,但我从来没有使用过它,不知道它是否适合我想要实现的。例如,我的“工具栏”是否会包含一个包含每个小部件可以填充的区域的shell?单击某个窗口小部件时显示的每个新窗口是否也将拥有自己的区域设置?如果我可以获取工具栏上的工具栏和一个小部件的图案,我可以将其复制到其余的小部件上。

除了棱镜,我有一个关于如何MVVM应该如何实现某些数据编辑窗口的问题。比方说,我有一个显示一些数据的图表,用户可以直接在图表上点击/鼠标移动来编辑他所看到的数据。所有数据都在模型中,并且视图模型通过绑定将该数据提供给视图。我的问题是,将鼠标点击/移动事件,特定于该视图中的图表,写在哪里?我们不希望在视图的代码中留下太多/任何东西,我们也不希望在视图模型中拥有UI事件处理程序,所以我不确定如何处理这种类型的场景。我知道命令是这里可能的答案,但我所看到的MVVM示例通常显示简单按钮单击的示例命令。大意是否一致?所以,如果任何人有任何关于上述或关于使用WPF和MVVM/Prism的一般提示的建议,请让我知道。

谢谢。

+0

本文使用MEF而不是Prism,但在使用IoC的东西时有其他一些关于WPF和MVVM的有趣想法:http://www.codeproject.com/KB/WPF/SoapBoxCorePinBallDemo.aspx – 2010-08-31 01:12:48

这里有几个问题,所以我会尽我所能全面覆盖它们。

我曾经参与过一个WPF,MVVM和Prism等项目。最好的建议是在将它们粘合在一起之前了解每个组件的功能和功能。在这种情况下,您不必使用Prism的所有功能。

对于棱镜可以使用...

  1. 壳牌和引导程序初始化其他组件的应用程序和加载模块。
  2. 为依赖注入创建和配置Unity。您可以使用其他DI容器。在这里您可以添加每个模块将使用的全局服务。
  3. 使用EventAggregator通过模块和视图通知应用程序的不同部分
  4. 命名UI上的区域以便模块可以将视图添加到特定位置的区域。

上述4并不都必须使用,但可以很容易地集成到MVVM/WPF应用程序中。

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

在这里你可以有一个你创建的区域(你可以从Region派生)来管理工具栏上的按钮。 (我曾经用过一个关于Ribbon的区域)。一个服务可以通过一个接口暴露出来,每个模块可以提供命令/图像(你有什么),当它被点击时会创建一个ViewModel。你可以在模块的初始化中做到这一点。

将各自的新窗口,是 显示当一个widget被点击 也有自己的壳与自己 区域设置?

如果每个按钮打开一个全新的窗口,我会建议引入一个共同的控制器类,将创建一个通用应用窗口,并附上你的模块创建一个视图模型。在这种情况下不需要使用区域,除非您将不同的视图粘贴到保持比视图本身的寿命更长的应用程序窗口。在基本形式的窗口,可以简单地将这个......

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

如果你的控制器内就可以做到这一点...

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

控制器可以在模块中直接使用的包裹内的服务...虽然对于testabilty服务和界面将是最好的。确保您已将模块资源与Applicaiton.Resources合并,并使用DataTemplate将您的视图链接到视图模型。

我的问题是在哪里将鼠标 点击/移动事件,提出了具体 到该视图中的图表,写?

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

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

HTH

+0

感谢您的信息和提示。他们非常感激。 – Flack 2010-08-30 18:40:34

我认为棱镜会为您工作。

- >我的“工具栏”是一个包含每个小部件可以填充的区域的shell吗?

  1. 将单个区域与一个ItemsControl在壳
  2. 创建模块每个插件
  3. 不断增加的插件模块以相同的ItemsControl壳区。

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

- >单击某个窗口小部件时显示的每个新窗口是否也是它自己的具有其自己的区域设置的shell?不,你可以在shell中使用'WindowRegionAdapter'来在不同的窗口中为你的小部件创建视图。

- >鼠标在哪里点击/移动特定于该视图中图表的事件?

您可以使用附加行为将视图中的事件绑定到纯粹在XAML中的ViewModel中的命令。谷歌的“混合行为”或“附加行为”为你如何去做。没有必要为此编写任何代码。

说实话,我只是试图给你你想要搜索的关键字,以获得你需要的所有信息。

+0

谢谢。我会搜索一些更多的信息。 – Flack 2010-08-30 18:40:58