在大型应用程序中使用MVVM - 共享视图模型,模型,状态等

use*_*153 11 .net c# mvvm

我想知道你们中是否有人知道一些很好的教程解释大型应用程序的MVVM.我发现的MVVM上的每个教程都只是解释了基础知识(如何实现模型,视图模型和视图),但我对应用程序页面之间传递数据时的技术和模式很感兴趣,初始化视图模型,存储常见应用程序的位置数据(在多个视图模型之间共享)等.

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

Lou*_*ann 9

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

如果数据传递是事件驱动的(即:您希望在接收从服务器推送的数据时通知),请使用弱事件.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)
  • 不惜一切代价避免任何数据重复,一直到DAL.对于可以通过I(多)ValueConverter推导出的字段进行同步变得非常复杂.
    示例:您有一个音频文件.它有开始时间,结束时间和持续时间.摆脱这3个属性中的任何一个,第三个可以推断出来.

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

希望这可以帮助!