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


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

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


3715
2017-09-14 10:51


起源

太一般回答恕我直言。此外,人们通常会选择与其选择框架相匹配的设计 - 很难找到不针对特定框架的交钥匙解决方案。 - Jon
针对特定框架的解决方案对我也有用,如果我能得到想法/模式...... - user969153
可悲的是,我担心你找不到你想要的答案。 99%的MVVM“例子”只是玩具,只能(几乎没有)回答简单的问题。我还没有找到任何大型,严肃的应用样本 - Schneider


答案:


在两者之间传递数据时的技术和模式   申请页面

如果数据传递是事件驱动的(即:您希望在接收从服务器推送的数据时通知),请使用弱事件。 Prism的EventAggregator是众多实现中的一种。

如果数据传递是常量,那么让DataContext向下流动XAML树并简单地使用绑定。
这意味着如果你有一个“主”UserControl使用其他更具体的UserControls,不要设置他们的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} />
  • 不惜一切代价避免 任何数据重复,一直到DAL。对于可以通过I(多)ValueConverter推导出的字段进行同步变得非常复杂。
    例: 你有一个音频文件。它有开始时间,结束时间和持续时间。摆脱这三个属性中的任何一个,第三个可以推断出来。

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

希望这可以帮助!


9
2017-09-14 11:36



很好,密集的答案,谢谢。 (但是,如果有任何你可以推荐的话,关于“在XAML树上流动DataContext”和“视图模型上的继承/组合以及控制器模式”解决方案的更多信息链接将会很有帮助) - user969153
让DataContext流程要求你什么都不做,默认是这样。 VM中的继承/组件具有包含一些数据的公共字段,并且该数据来自首先调度它的控制器。 - Louis Kottmann
再次感谢,伙计。 - user969153
我想要一些例子。我有一个非常复杂的5级嵌套数据源 - 需要这么全面,并且找不到任何方法在“正确”的mvvm中正确表示它。 DAL不在内部(对于ms访问)并且模型类是通过自定义生成器构建的。 - Richard Griffiths


你可能想看看这本书: 使用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
2017-09-14 11:22





首先,您可以创建一个BaseViewModel,其中包含一些在所有ViewModel中都很常见的属性。使用依赖注入之类的 城堡 / PRISM4 将数据从一个发送到另一个我们使用的视图模型 棱镜EventAggregator 我希望这对你的任务有所帮助。但就像Jon说的那样,完全取决于你喜欢使用的东西。但这些都是很好的起点。


1
2017-09-14 11:10