【问题标题】:MVVM Light Messenger between Model -> ViewModel communicationModel -> ViewModel 之间的 MVVM Light Messenger 通信
【发布时间】:2015-05-10 22:18:51
【问题描述】:

我注意到 MVVM Light 框架中 ViewModelBase 的每个孩子都可以覆盖构造函数

public ViewModelBase(IMessenger messenger)

在模型更改时使用 IMessenger 与模型到 ViewModel 通信并更新 ViewModel 是否可以(从架构上讲)?

这意味着每个模型都有自己的 IMessenger 实例,每个视图模型都会订阅这些消息。

现在我正在使用这样的界面

public interface IModel
{
  event EventHandler<ModelStatusChangedArgs> StatusChanged;
}

对于每个有点……痛苦的模型,我觉得我做错了什么。

【问题讨论】:

  • 我认为您正在寻找 inotifypropertychanged ?
  • @JTIM,我认为 ViewModelBase 实现了 INotifyPropertyChanged。
  • 啊,我知道这个接口(也是 VMB-ViewModelBase 实现的)。我想用它来收藏。假设我的 ViewModel 中有 ObservableCollection,我想通知 From Model 到 ViewModel 我的项目已添加到集合中。
  • 通知是你想在viewmodel中调用一个事件函数或者observableCollection更新了,这样你就可以在view中显示新的信息了?

标签: c# mvvm mvvm-light


【解决方案1】:

从技术上讲,您可以将它用于您不知道谁可能会听该事件或对该事件感兴趣的所有情况。

但是 MVVM Light 是一个 MVVM 框架,它实际上是用来允许 ViewModel 松耦合的。在您的模型中使用它最终会将您的模型与您的 MVVM 框架联系起来。

但是没有什么可以阻止您编写自己的事件聚合器/消息传递系统(即领域事件)。您还可以通过围绕 MVVM Light 的 messenger 实现包装器来从 ViewModel 中删除 Messanger 依赖项。

你通常希望保留这个“层”依赖:

  • 您的基础架构(ASP.NET、持久性)应取决于您的域/业务层
  • 您的业务层不应依赖于任何其他层。这包含您的应用程序的核心及其所有领域逻辑(业务规则/逻辑)
  • 您的应用程序层 (ViewModel) 应仅依赖于您的域/业务层。 ViewModel 仅包含 Presentation Logic
  • 您的表示层(视图)应仅依赖于您的视图模型。视图应该不知道业务层(MVVM 中的模型)。

而 MVVM 框架位于“应用层”中,模型不应该意识到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多