Rob*_*uch 7 c# wpf events message mvvm
我正在使用MVVM模式对WPF应用程序进行原型设计.在回答这个问题后,我设置了一个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();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,这将是将要发生的事情:
LoginModel属性的属性.modelService.LoginModel.MyProperty = localLoginModel.MyProperty;LoginModel只是改变了."我该如何实现:
您可以使用MessageBus或EventAggregator通过使用弱引用向订阅者发布消息。看看我的实现(或者NuGet 包)。
它还可以通过应用以下方法将消息处理编组到 UI 线程(如果您需要更新 UI 组件):HandleOnUIThreadAttribute它还可以通过应用onHandle。
在你的情况下的用法将是这样的:
// 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
}
}
Run Code Online (Sandbox Code Playgroud)
如果您想了解更多关于内部工作原理以及如何实现的信息;查看GitHub 存储库中的源代码。请随意使用您喜欢的代码:)