我在想,是否有人知道一些关于大型应用程序中MVVM的好教程。我找到的所有有关MVVM的教程都只是解释基础知识(如何实现模型、视图模型和视图),但对于在应用程序页面之间传递数据的技术和模式,以及初始化视图模型的位置、存储公共应用程序数据(在多个视图模型之间共享)等方面的问题我很感兴趣。
我更喜欢没有任何MVVM框架(例如MVVMLight)的纯c#/XAML解决方案。
我在想,是否有人知道一些关于大型应用程序中MVVM的好教程。我找到的所有有关MVVM的教程都只是解释基础知识(如何实现模型、视图模型和视图),但对于在应用程序页面之间传递数据的技术和模式,以及初始化视图模型的位置、存储公共应用程序数据(在多个视图模型之间共享)等方面的问题我很感兴趣。
我更喜欢没有任何MVVM框架(例如MVVMLight)的纯c#/XAML解决方案。
在应用程序页面之间传递数据的技术和模式
如果数据传递是事件驱动的(即:您希望在从服务器推送的数据接收时通知),请使用弱事件。Prism的EventAggregator是许多实现之一。
如果数据传递是常量,请让DataContext沿着XAML树向下流动并简单地使用绑定。
这意味着,如果您有一个“主”UserControl,它使用其他更具体的UserControl,不要设置它们的DataContext,它们将继承主元素的DataContext,一切都很好。
如果您想分离功能,请在主ViewModel中使用组合。
在哪里初始化视图模型
纯粹主义者会告诉你在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} />
如果我想到更多的建议,我会回来添加的。
希望这能帮到你!
首先,您可以创建一个BaseViewModel,其中包含所有ViewModel中通用的一些属性。使用依赖注入,例如Castle / Prism4,将数据从一个ViewModel发送到另一个ViewModel,我们使用了Prisms EventAggregator。希望这能帮助您完成任务。但正如Jon所说,完全取决于您喜欢使用什么。但这些都是很好的起点。