用于新WPF项目的Prism和MVVM

时间:2010-08-29 23:33:51

标签: wpf mvvm prism

我将很快开始一个新项目,并且正在寻找那些有WPF,Prism和MVVM经验的人的建筑建议。

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

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

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

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

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

谢谢。

2 个答案:

答案 0 :(得分:4)

有几个问题,所以我会尽力覆盖它们。

我参与了一个包含WPF,MVVM和Prism以及其他框架的项目。最好的建议是在将它们粘合在一起之前了解每个的功能和功能。您不必使用Prism的所有功能,因为它在这种情况下非常有用。

对于Prism,你可以使用......

  1. Shell和bootstrapper初始化应用程序并从其他程序集加载模块。
  2. 为依赖注入创建和配置Unity。您可以使用其他DI容器。在这里,您可以添加每个模块将使用的全局服务。
  3. 使用EventAggregator通知跨模块和视图的应用程序的不同部分
  4. 用于在UI上命名区域的区域,以便模块可以将视图添加到特定位置。
  5. 以上4并非都必须使用,但可以轻松集成到MVVM / WPF应用程序中。

      

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

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

      

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

    如果每个按钮打开一个全新的窗口,我建议引入一个通用控制器类,它将创建一个通用的使用窗口并附加模块创建的视图模型。除非您将不同的视图粘贴到比视图本身的生命周期更长的应用程序窗口,否则在这种情况下不需要使用区域。基本形式的窗口可以就是这个......

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

    在你的控制器里,它可以做到这一点......

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

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

      

    我的问题是鼠标在哪里   点击/移动特定的事件   到那个视图中的图表,写下来?

    不要害怕后面的代码,但在这种情况下,您可以使用EventToCommand附加的行为来路由到您的viewmodel上的命令。 MVVMLight工具包具有此功能,您可以根据需要重复使用。

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

    HTH

答案 1 :(得分:1)

我认为Prism对你很有用。

- &gt;我的“工具栏”是否包含每个小部件将填充的区域的外壳?

  1. 在Shell中放置带有ItemsControl的单个区域
  2. 为每个小部件创建模块
  3. 继续将小部件模块添加到相同的itemscontrol shell区域。
  4. 这样做的最大优点是,如果添加更多模块,则无需更改任何内容。

    - &gt;单击窗口小部件时显示的每个新窗口是否也是自己的shell,并且有自己的区域设置?

    不,您可以在shell中使用'WindowRegionAdapter'在单独的窗口中为小部件创建视图。

    - &gt;鼠标点击/移动事件(特定于该视图中的图表)会写在哪里?

    您可以使用附加的行为将视图中的事件绑定到ViewModel中的命令,完全在XAML中。 Google的“混合行为”或“附加行为”,了解您如何做到这一点。没有必要为此编写任何代码。

    说实话,我只想给你一些你想要搜索的关键词来获取你需要的所有信息。