我想知道你们中是否有人知道一些很好的教程解释大型应用程序的MVVM.我发现的MVVM上的每个教程都只是解释了基础知识(如何实现模型,视图模型和视图),但我对应用程序页面之间传递数据时的技术和模式很感兴趣,初始化视图模型,存储常见应用程序的位置数据(在多个视图模型之间共享)等.
我更喜欢没有任何MVVM框架的纯c#/ XAML解决方案(MVVMLight等).
在应用程序页面之间传递数据时的技术和模式
如果数据传递是事件驱动的(即:您希望在接收从服务器推送的数据时通知),请使用弱事件.Prism的EventAggregator是众多实现中的一种.
如果数据传递是常量,那么让DataContext向下流动XAML树并简单地使用绑定.
这意味着如果你有一个使用其他更具体的UserControls的"主"UserControl,不设置他们的DataContext,他们将继承master,并且一切都很好.
如果要分离功能,请在master的viewmodel中使用composition.
在哪里初始化viewmodels
纯粹主义者会告诉你直接在XAML中实例化它们.我几乎从不这样做.
首先,ViewModels通常需要服务,它们作为构造函数参数传递,或者通过构造函数中的MEF注入......等等.所以你不能拥有无参数构造函数,或者它更难.
现在,我们可以做很多事情,但有什么好处呢?让视图的代码隐藏检索ViewModel,或者在构造函数中注入它是完全正确的.
存储公共应用程序数据的位置(在多个视图模型之间共享)
如果数据是全局的:使用静态类/属性,
在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.
}
Run Code Online (Sandbox Code Playgroud)
在XAML中:
<TextBox Visibility={customMrkup:VisibilityBinding} />
Run Code Online (Sandbox Code Playgroud)
如果我想到更多提示,我会回来添加它们.
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
4849 次 |
| 最近记录: |