7

我正在使用 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();
  }    
}

现在,这就是将会发生的事情:

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

我该如何实施:

  1. “广播信息”?
  2. 订阅消息?
4

2 回答 2

4

您可以使用 a MessageBusorEventAggregator通过弱引用向订阅者发布消息。看看我的实现(或NuGet 包)。

它还可以通过应用HandleOnUIThreadAttributeonHandle方法为您将消息处理编组到 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 存储库中的源代码。随意使用代码:)

于 2013-01-18T09:09:46.323 回答
3

如果要在 WPF 应用程序中分发消息,可以使用prism框架EventAggregator 。

EventAggregator 允许视图模型弱订阅事件,不需要知道发送者。这使您可以轻松地跨组件或模块分发消息。

于 2013-01-18T09:06:42.463 回答