我正在使用MVVM模式对WPF应用程序进行原型设计。在回答this question之后,我设置了一个ModelProviderService
,它将模型公开为属性。服务的消费者是视图模型,即他们从服务中提取模型而不是自己实例化。
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
类型模型刚改变了。”我该如何实施:
答案 0 :(得分:3)
如果要在WPF应用程序中分发邮件,可以使用EventAggregator prism框架。
EventAggregator允许视图模型弱地接收事件,不需要了解发送者。这使您可以轻松地在组件或模块之间分发消息。
答案 1 :(得分:3)
您可以使用MessageBus
或EventAggregator
通过弱引用向订阅者发布消息。请查看my implementation(或the NuGet packgage)。
它还可以通过在HandleOnUIThreadAttribute
方法上应用Handle
来为您编组消息处理到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
}
}
如果您想了解更多关于内部工作原理以及如何实现这一点;查看GitHub repository中的源代码。随意使用代码:)