c# - 在大型应用程序中使用 MVVM - 共享 View 模型、模型、状态等

标签 c# .net mvvm

我想知道你们中是否有人知道一些很好的教程来解释大型应用程序的 MVVM。我发现关于 MVVM 的每个教程都只是基础知识解释(如何实现模型、 View 模型和 View ),但我对在应用程序页面之间传递数据、在哪里初始化 View 模型、在哪里存储常见应用程序的技术和模式感到好奇数据(在多个 View 模型之间共享)等。

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

最佳答案

techniques and patterns when it comes to passing data between application pages

如果数据传递是事件驱动的(即:您想在收到服务器推送的数据时发出通知),请使用弱事件。 Prism 的 EventAggregator 是众多实现之一。

如果数据传递是常量,让 DataContext 沿着 XAML 树向下流动并简单地使用绑定(bind)。
这意味着如果您有一个使用其他更具体的 UserControl 的“主”UserControl,请不要设置它们的 DataContext,它们将继承主控的,一切都很好。
如果要分离功能,请在主视图模型中使用组合。

where to init viewmodels

纯粹主义者会告诉您直接在 XAML 中实例化它们。我几乎从不这样做。
首先,ViewModels 通常需要服务,它们作为构造函数参数传递,或者通过构造函数中的 MEF 注入(inject)……等等。所以你不能有一个无参数的构造函数,否则会更难。

现在,我们可以做一些困难的事情了,但是有什么好处呢?让 View 的代码隐藏检索 ViewModel 或将其注入(inject)到其构造函数中是完全没问题的。

where to store common application data (shared between multiple viewmodels)

如果数据是全局的:使用静态类/属性,
在 XAML 中,您可以通过 {x:Static my:StaticClass.StaticProperty} 访问它们,如果您想访问嵌套类/枚举,请使用 + 而不是 .

如果数据仅在多个 ViewModel 之间共享,而不是在所有 ViewModel 之间共享,请在 ViewModel 上使用继承/组合以及 Controller 模式。

从经验中收集的其他技巧:

  • 只严格绑定(bind)您需要的内容:当您只需要其中的一个字符串时,不要绑定(bind)到整个对象。

  • 如果您一次又一次地绑定(bind)相同的东西,请毫不犹豫地通过继承 Binding/MultiBinding 来制作自定义标记。它是 DRY 101,但大多数人出于某种原因只是复制/粘贴绑定(bind)。

示例:

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(Multi)ValueConverter 推导的字段变得非常复杂。
    示例:您有一个音频文件。它有开始时间、结束时间和持续时间。去掉这三个属性中的任何一个,可以推导出第三个。

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

希望这对您有所帮助!

关于c# - 在大型应用程序中使用 MVVM - 共享 View 模型、模型、状态等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12423034/

相关文章:

c# - 如何将 IIS 上的 WCF (svc) 服务配置为仅处理 HTTPS 请求?

c# - 如何判断列表框中的内容在哪一行

c# - 在 WPF MVVM 中通信两个 View 模型

.net - Haskell 或 F# 高吞吐量二进制 I/O

c# - 如何将外键从一个 View 传递到另一个 View ?

c# - 在dragablz :TabablzControl wpf mvvm的所有其他选项卡中显示的另一个选项卡中具有相似长度的文本框的虚线

wpf - 从控件继承与创建新的控件模板

c# - 更换 Outlook 2010 发送按钮?

c# - NodeType.Certificates 需要什么样的规范?

c# - 将字体更改为 DataGridView 行在 WinForms C# 中不起作用