Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中实现消息/订阅机制#_C#_Wpf_Events_Mvvm_Message - Fatal编程技术网

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

C# 在C语言中实现消息/订阅机制#,c#,wpf,events,mvvm,message,C#,Wpf,Events,Mvvm,Message,我正在用MVVM模式原型化WPF应用程序。在回答问题之后,我设置了一个ModelProviderService,它将模型公开为属性。服务的使用者是viewmodels,也就是说,他们从服务中提取模型,而不是自己实例化模型 class ModelProviderService { private LoginModel loginModel; public LoginModel LoginModel { get { return loginModel; } set { lo

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

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();
  }    
}
现在,下面是将要发生的事情:

  • viewmodel会更改的属性,例如
    LoginModel
    属性
  • viewmodel通过设置其属性将模型属性推回服务:
    modelService.LoginModel.MyProperty=localLoginModel.MyProperty
  • 该服务将发布一条消息:“嘿,我的
    LoginModel
    型号刚刚更改。”
  • 订阅此消息的任何其他viewmodel都将从服务中提取此已更改的模型
我如何实施:

  • “广播信息”
  • 该邮件的订阅

  • 如果您想在WPF应用程序中分发消息,可以使用框架的形式


    EventAggregator允许viewmodels弱订阅事件,无需了解发送者。这使您可以轻松地跨组件或模块分发消息。

    您可以使用
    MessageBus
    EventAggregator
    通过弱引用向订阅者发布消息。看看(或)

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

    在您的案例中的用法如下:

    // 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
        }
    }
    
    //消息
    公共类登录模型已更改
    {
    公共LoginModelChanged(LoginModel模型)
    {
    模型=模型;
    }
    公共登录模型{get;private set;}
    }
    //发布消息的服务
    公共类ModelProviderService
    {
    专用IMessageBus_messageBus;
    私有LoginModel\u LoginModel;
    公共模型提供者服务(IMessageBus messageBus)
    {
    _messageBus=messageBus;
    }
    公共登录模型登录模型
    {
    获取{return\u loginModel;}
    设置
    {
    _loginModel=值;
    _Publish(新的LoginModelChanged(值));
    }
    }
    }
    //订阅视图模型
    公共类SomeViewModel:IHandle
    {
    公共SomeViewModel(IMessageBus messageBus)
    {
    messageBus.Subscribe(这个);
    }
    公共无效句柄(LoginModelChanged消息)
    {
    //用message.Model做点什么
    }
    }
    
    如果您想了解更多关于内部工作以及如何实现这一点;请在中查看源代码。可以随意使用代码:)