我想知道你们中是否有人知道一些解释大型应用程序的 MVVM 的好教程。我发现的每个关于 MVVM 的教程都只是基本解释(如何实现模型、视图模型和视图),但我对在应用程序页面之间传递数据、在哪里初始化视图模型、在哪里存储常见应用程序的技术和模式感到好奇数据(在多个视图模型之间共享)等。
我更喜欢没有任何 MVVM 框架(MVVMLight 等)的纯 c#/XAML 解决方案。
在应用程序页面之间传递数据时的技术和模式
如果数据传递是事件驱动的(即:您想在收到服务器推送的数据时通知),请使用弱事件。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} />
如果我想到更多提示,我会回来添加它们。
希望这可以帮助!
您可能想看看这本书: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
首先,您可以创建一个具有所有 ViewModel 共有的一些属性的 BaseViewModel。使用诸如Castle / Prism4 之类的依赖注入将数据从一个视图模型发送到我们使用Prisms EventAggregator的另一个视图模型我希望这对您的任务有所帮助。但就像乔恩说的,这完全取决于你喜欢使用什么。但这些都是很好的起点。