【问题标题】:MVVM Child models and Navigation and beerMVVM 子模型和导航和啤酒
【发布时间】:2013-10-12 00:36:52
【问题描述】:

我在酒吧喝了几杯啤酒,这个女孩争辩说让 mvvm 与现实世界的应用程序一起工作很痛苦,她说为了解决 mvvm 中的问题,你添加更多代码然后你得到另一个问题和你添加更多的代码,它永远不会结束,我同意,当我读到 mvvm 听起来不错,我不想使用棱镜或 MVVM 灯,我只需要一种在我的视图之间切换的方法。我的应用程序看起来像这样,所以请在我酒精中毒之前启发我

【问题讨论】:

  • 现实世界的应用程序是否等同于一个非常混乱的 UI?
  • @flup 我制作了这样的用户界面,因为我认为这是学习它的最佳方式
  • 我不知道你在说什么。 MVVM 比我见过的任何东西都更干净,需要更少的代码。只需将一些<ContentPresenter/>s 放在那里并将它们绑定到一些相关的 ViewModel。你有什么问题?
  • 是的。如果您想要松散耦合的通信,则需要一个 EventAggregator(不是专门在 MVVM 中,而是在您能想到的任何其他松散耦合架构中)。你可以实现这种类型的 UI,只需使用一个带有一些属性的 MainViewModel 来确定在较小的视图中显示什么。有数千种方法可以实现这一点,您可以选择最喜欢的任何一种。 MVVM 不是一套硬核规则,它只是一套指导方针,其中最重要的是“不要把业务逻辑放在 Code-Behind 中”
  • 它只是一个具有事件的类,订阅者处理该事件并对其做出反应。它还有一个 void 方法,您可以调用它来引发事件

标签: c# mvvm viewmodel


【解决方案1】:

如果你想要松耦合的通信,你需要一个 EventAggregator:

//Simplest EventAggregator
public static class DumbAggregator
{
    public static void BroadCast(string message)
    {
       if (OnMessageTransmitted != null)
           OnMessageTransmitted(message);
    }

    public static Action<string> OnMessageTransmitted;
}

用法:

public class MySender
{
   public void SendMessage()
   {
       DumbAggregator.BroadCast("Hello There!");
   }
}

public class MySubscriber
{
   public MySubscriber()
   {
       DumbAggregator.OnMessageTransmitted += OnMessageReceived;
   }

   private void OnMessageReceived(string message)
   {
      MessageBox.Show("I Received a Message! - " + message);
   }
}

如果您不喜欢子 ViewModel,您可以将所有内容放在单个 ViewModel 中,并使用一些 DataTriggers 或其他东西来动态更改视图,但是父 - 子 ViewModel 方法更简洁 IMO。

【讨论】:

  • 它比我想象的要简单,例如我可以使用它运行另一个视图模型上的命令吗?
  • @user1590636 是的。您几乎可以做任何您需要的事情,而无需在您的虚拟机/层之间创建耦合。但是请注意,包含在诸如 Prism 等框架中的 EventAggregator 要复杂得多,并且包含大量功能。
  • 我对它进行了测试,它很可爱任何关于彼此的事情,尤其是当你真的喝醉的时候
  • 非常感谢您提供的示例。我在这上面坐了好几个小时,试图弄清楚如何让它发挥作用!
猜你喜欢
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
相关资源
最近更新 更多