【问题标题】:Prism and MVVM for new WPF project用于新 WPF 项目的 Prism 和 MVVM
【发布时间】:2010-08-29 23:33:51
【问题描述】:

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

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

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

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

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

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

谢谢。

【问题讨论】:

标签: wpf mvvm prism


【解决方案1】:

里面有几个问题,所以我会尽力解决所有问题。

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

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

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

以上 4 项不必全部使用,但可以轻松集成到 MVVM /WPF 应用程序中。

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

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

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

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

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

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

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

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

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

不要害怕后面的代码,但在这种情况下,您可以使用 EventToCommand 附加行为,该行为将路由到您的视图模型上的命令。 MVVMLight toolkit 有这个,你可以根据需要重复使用。

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

HTH

【讨论】:

  • 感谢您提供的信息和提示。非常感谢他们。
【解决方案2】:

我认为 Prism 非常适合您。

->我的“工具栏”会是一个外壳,其中包含每个小部件将填充的区域吗?

  1. 在 Shell 中放置一个带有 ItemsControl 的区域
  2. 为每个小部件创建模块
  3. 继续将小部件模块添加到相同的项目控制外壳区域。

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

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

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

->特定于该视图中图表的鼠标单击/移动事件将写入何处?

您可以使用附加行为将视图中的事件绑定到纯 XAML 中的 ViewModel 中的命令。谷歌“混合行为”或“附加行为”,了解如何去做。无需为此编写任何代码。

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

【讨论】:

  • 谢谢。我将搜索更多信息以获取更多信息。
猜你喜欢
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多