我想知道你们中是否有人知道一些很好的教程解释大型应用程序的MVVM。我发现的MVVM上的每个教程都只是解释了基础知识(如何实现模型,视图模型和视图),但我对应用程序页面之间传递数据时的技术和模式很感兴趣,初始化视图模型的位置,存储常见应用程序的位置数据(在多个视图模型之间共享)等。
我更喜欢没有任何MVVM框架的纯c#/ XAML解决方案(MVVMLight等)。
答案 0 :(得分:9)
介于两者之间传递数据时的技术和模式 申请页面
如果数据传递是事件驱动的(即:您希望在接收从服务器推送的数据时通知),请使用弱事件。 Prism的EventAggregator是众多实现中的一种。
如果数据传递是常量,那么让DataContext向下流动XAML树并简单地使用绑定
这意味着如果你有一个使用其他更具体的UserControls的“主”UserControl,不设置他们的DataContext,他们将继承master,并且一切都很好。
如果要分离功能,请在master的viewmodel中使用composition。
在哪里初始化viewmodels
纯粹主义者会告诉你直接在XAML中实例化它们。我几乎从不这样做 首先,ViewModels通常需要服务,它们作为构造函数参数传递,或者通过构造函数中的MEF注入......等等。所以你不能有无参数构造函数,或者它更难。
现在,我们可以做很多事情,但有什么好处呢?让视图的代码隐藏检索ViewModel,或者在构造函数中注入它是完全没问题的。
在哪里存储常见的应用程序数据(在多个之间共享) 的ViewModels)
如果数据是全局的:使用静态类/属性,
在XAML中,您可以通过{x:Static my:StaticClass.StaticProperty}
访问它们,如果您想要获得嵌套的类/枚举,请使用+
代替.
如果数据仅在多个ViewModel之间共享,但并非全部共享,请在视图模型上使用继承/合成以及控制器模式。
从经验中收集的其他提示:
只严格绑定您需要的内容:当您只需要一个字符串时,不要绑定到整个对象。
如果您反复绑定相同的内容,请不要犹豫,通过继承Binding
/ MultiBinding
来制作自定义标记。这是DRY 101,但大多数人只是出于某种原因复制/粘贴Bindings。
示例:的
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} />
如果我想到更多提示,我会回来添加它们。
希望这有帮助!
答案 1 :(得分:2)
您可能希望查看本书:使用Windows Presentation Foundation和模型视图ViewModel模式构建企业应用程序(例如,在Amazon.com)。
它在更一般的环境中接近MVVM,而不仅仅是一个5分钟的代码片段,甚至可以提供有关如何组织业务解决方案的建议。
我们经常在工作中使用它作为参考。就个人而言,我希望它能更深入地了解细节。但是,从业务线应用程序的角度来看,进入MVVM是一个很好的阅读。
说明文字:
创建丰富,灵活且可维护的业务线应用程序 使用MVVM设计模式
通过应用来简化和改进业务应用程序开发 Windows Presentation Foundation(WPF)和Microsoft®的MVVM模式 Silverlight®4。通过本实践指南,您将使用MVVM和数据 绑定,命令和行为以松散地创建用户界面 与业务逻辑相结合。 MVVM是.NET开发人员工作的理想选择 使用WPF和Silverlight - 无论您是否具有构建经验 企业应用程序。
了解如何:
- 深入了解MVVM,并了解它与其他UI设计模式的区别 构建一个简单的客户关系管理应用程序,您可以根据自己的项目进行调整
- 实现MVVM以维护UI声明性语法和表示逻辑代码之间的分离
- 创建域模型以定义应用程序的业务环境
- 使用Microsoft Entity Framework和NHibernate
编写数据访问层的动态代码- 使用Windows Workflow Foundation 4实施复杂的数据验证方案
- 使用Microsoft Prism
等框架和工具包实现MVVM
答案 2 :(得分:1)
首先,您可以创建一个BaseViewModel,其中包含一些在所有ViewModel中都很常见的属性。使用Castle / Prism4之类的依赖注入将数据从一个视图模型发送到另一个我们使用的视图模型Prisms EventAggregator我希望这有助于您的任务。但就像Jon说的那样,完全取决于你喜欢使用的东西。但这些都是很好的起点。