C# 在C语言中实现消息/订阅机制#
我正在用MVVM模式原型化WPF应用程序。在回答问题之后,我设置了一个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
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做点什么
}
}
如果您想了解更多关于内部工作以及如何实现这一点;请在中查看源代码。可以随意使用代码:)