首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中实现消息/订阅机制

在C#中实现消息/订阅机制
EN

Stack Overflow用户
提问于 2013-01-18 09:01:23
回答 2查看 3.5K关注 0票数 7

我正在用MVVM模式创建一个WPF应用程序的原型。在回答这个问题之后,我设置了一个ModelProviderService,它将模型公开为属性。服务的使用者是视图模型,即他们从服务中提取模型,而不是实例化它们自己。

代码语言:javascript
复制
class ModelProviderService {

  private LoginModel loginModel;
  public LoginModel LoginModel {
    get { return loginModel; }
    set { loginModel = value; }
  }

  private ProjectsModel projectsModel;
  public ProjectsModel ProjectsModel {
    get { return projectsModel; }
    set { projectsModel = value; }
  }

  public ModelProviderService() {
    loginModel = new LoginModel();
    projectsModel = new ProjectsModel();
  }    
}

现在,下面是将要发生的事情:

  • 视图模型更改属性(例如,LoginModel属性)。
  • 视图模型通过设置它的属性:modelService.LoginModel.MyProperty = localLoginModel.MyProperty;将模型属性推回服务。
  • 该服务将发布一条消息:“嘿,我的LoginModel类型刚刚改变了。”
  • 订阅此消息的任何其他视图模型都将从服务中提取此更改的模型。

我如何实施:

  1. “广播信息”?
  2. 对消息的订阅?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-18 09:09:46

您可以使用MessageBusEventAggregator使用弱引用将消息发布到订阅服务器。看看我的实施 (或NuGet封装)。

它还可以通过在HandleOnUIThreadAttribute方法上应用Handle将消息处理封送到UI线程(如果需要更新UI组件)。

在您的情况下,使用情况如下:

代码语言:javascript
复制
// The message
public class LoginModelChanged
{
    public LoginModelChanged(LoginModel model)
    {
        Model = model;
    }

    public LoginModel Model { get; private set; }
}

// Service that publishes messages
public class ModelProviderService
{
    private IMessageBus _messageBus;
    private LoginModel _loginModel;

    public ModelProviderService(IMessageBus messageBus)
    {
        _messageBus = messageBus;
    }

    public LoginModel LoginModel
    {
        get { return _loginModel; }
        set
        {
            _loginModel = value;
            _messageBus.Publish(new LoginModelChanged(value));
        }
    }
}

// Subscribing ViewModel
public class SomeViewModel : IHandle<LoginModelChanged>
{
    public SomeViewModel(IMessageBus messageBus)
    {
        messageBus.Subscribe(this);
    }

    public void Handle(LoginModelChanged message)
    {
        // Do something with message.Model
    }
}

如果您想了解更多关于内部工作原理和如何实现这一点的知识,请查看GitHub存储库中的源代码。请随意使用您喜欢的代码:)

票数 4
EN

Stack Overflow用户

发布于 2013-01-18 09:06:42

如果您想在WPF应用程序中分发消息,可以使用EventAggregator of 棱镜框架。

EventAggregator允许视图模型对事件进行弱子分段,不需要有关发送方的知识。这使您可以轻松地跨组件或模块分发消息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14395442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档