13

我想知道你们中是否有人知道一些解释大型应用程序的 MVVM 的好教程。我发现的每个关于 MVVM 的教程都只是基本解释(如何实现模型、视图模型和视图),但我对在应用程序页面之间传递数据、在哪里初始化视图模型、在哪里存储常见应用程序的技术和模式感到好奇数据(在多个视图模型之间共享)等。

我更喜欢没有任何 MVVM 框架(MVVMLight 等)的纯 c#/XAML 解决方案。

4

3 回答 3

11

在应用程序页面之间传递数据时的技术和模式

如果数据传递是事件驱动的(即:您想在收到服务器推送的数据时通知),请使用弱事件。Prism 的 EventAggregator 是众多实现之一。

如果数据传递是恒定的,让 DataContext 沿着 XAML 树向下流动并简单地使用绑定。
这意味着如果您有一个“主”用户控件,它使用其他更具体的用户控件,不要设置他们的 DataContext,他们将继承主人的,一切都很好。
如果要分离功能,请在主视图模型中使用组合。

在哪里初始化视图模型

纯粹主义者会告诉您直接在 XAML 中实例化它们。我几乎从不这样做。
首先,ViewModel 通常需要服务,它们作为构造函数参数传递,或者通过 MEF 在构造函数中注入......等等。所以你不能有一个无参数的构造函数,或者更难。

现在,我们可以做一些困难的事情,但有什么收获呢?让视图的代码隐藏检索 ViewModel 或将其注入其构造函数是非常好的。

在哪里存储通用应用程序数据(在多个视图模型之间共享)

如果数据是全局的:使用静态类/属性,
在 XAML 中您可以通过 访问它们{x:Static my:StaticClass.StaticProperty},如果您想访问嵌套类/枚举,请使用+而不是.

如果数据只在几个 ViewModel 之间而不是全部之间共享,请在 ViewModel 上使用继承/组合以及控制器模式。

从经验中收集的其他提示:

  • 只严格绑定你需要的东西:当你只需要一个字符串时,不要绑定到整个对象。

  • 如果您一次又一次地绑定相同的东西,请不要犹豫,通过从Binding/继承来制作自定义标记MultiBinding。它是 DRY 101,但大多数人出于某种原因只是复制/粘贴绑定。

例子:

public class VisibilityBinding : MultiBinding, IMultiValueConverter
{
   public VisibilityBinding()
   {
      var isSomething = new Binding("IsSomething");
      isSomething.ElementName = myUsrCtrl;
      this.Bindings.Add(isSomething);

      //Add more bindings

      this.Converter = this;
    }

    //Implement IMultiValueConverter to compute a System.Visibility from the bound values.
}

在 XAML 中:

 <TextBox Visibility={customMrkup:VisibilityBinding} />
  • 不惜一切代价避免任何数据重复,一直到 DAL。同步可以通过 I(Multi)ValueConverter 推导出的字段很快就会变得复杂。
    示例:您有一个音频文件。它具有开始时间、结束时间和持续时间。去掉这三个属性中的任何一个,都可以推导出第三个。

如果我想到更多提示,我会回来添加它们。

希望这可以帮助!

于 2012-09-14T11:36:38.387 回答
2

您可能想看看这本书:Building Enterprise Applications with Windows Presentation Foundation and the Model View ViewModel Pattern(例如在Amazon.com)。

它在更一般的上下文中处理 MVVM,而不仅仅是 5 分钟的代码片段,甚至就如何组织业务解决方案给出了建议。

我们经常在工作中将其用作参考。就个人而言,我希望它会更深入一些细节。但是,从业务线应用程序的角度来看,MVVM 仍然是一本不错的读物。

说明文字:

使用 MVVM 设计模式创建丰富、灵活且可维护的业务线应用程序

通过将 MVVM 模式应用于 Windows Presentation Foundation (WPF) 和 Microsoft® Silverlight® 4 来简化和改进业务应用程序开发。通过本动手指南,您将使用 MVVM 与数据绑定、命令和行为来松散地创建用户界面与业务逻辑相结合。MVVM 是使用 WPF 和 Silverlight 的 .NET 开发人员的理想选择——无论您是否有构建企业应用程序的经验。

了解如何:

  • 深入了解 MVVM — 并了解它与其他 UI 设计模式的不同之处 构建一个简单的客户关系管理应用程序,您可以根据自己的项目进行调整
  • 实现 MVVM 以保持 UI 声明性语法和表示逻辑代码之间的分离
  • 创建域模型以定义应用程序的业务上下文
  • 使用 Microsoft Entity Framework 和 NHibernate 为数据访问层编写动态代码
  • 使用 Windows Workflow Foundation 4 实施复杂的数据验证方案
  • 使用 Microsoft Prism 等框架和工具包实现 MVVM
于 2012-09-14T11:22:45.720 回答
1

首先,您可以创建一个具有所有 ViewModel 共有的一些属性的 BaseViewModel。使用诸如Castle / Prism4 之类的依赖注入将数据从一个视图模型发送到我们使用Prisms EventAggregator的另一个视图模型我希望这对您的任务有所帮助。但就像乔恩说的,这完全取决于你喜欢使用什么。但这些都是很好的起点。

于 2012-09-14T11:10:09.667 回答