【问题标题】:How can I use identical model data in two different view models?如何在两个不同的视图模型中使用相同的模型数据?
【发布时间】:2012-11-19 20:44:14
【问题描述】:

我正在使用 MVVM 模式对 WPF 应用程序进行原型设计。该应用程序应有两个窗口:MainWindowLoginWindow

Model 包含两个属性:UsernamePassword

LoginWindow负责处理用户输入的用户名和密码,因此相应的视图模型会更新这些属性。但是,MainWindow 还需要访问用户名和密码,以便以后与客户端对象一起使用。

我应该如何处理?

LoginViewModel中创建的Model的实例传递给MainWindowViewModel的构造函数?

【问题讨论】:

    标签: c# mvvm properties views


    【解决方案1】:

    您需要的是一个 Messenger/Event Aggregator。事件聚合器是一个代理对象,您可以对其进行引用并指定要接收的事件类型,而无需获取引用,甚至无需了解生成事件的对象。

    Prism 的 EventAggregator 是最常见的一种。见:Event Aggregator

    所以:

    视图模型 1:

    public ViewModel1(IEventAggregator eventAggregator)
    {
        _eventAggregator=eventAggregator;
    }
    private void SendMessage()
    {
        _eventAggregator.GetEvent<UserLogin>().Publish(new UserLogin(_userName,_password);
    }
    

    视图模型 2:

    public ViewModel2(IEventAggregator eventAggregator)
    {
        _eventAggregator=eventAggregator;
        _eventAggregator.GetEvent<UserLogin>().Subscribe(UserLoginReceived,ThreadOption.BackgroundThread,true);
    }
    
    private void UserLoginReceived(UserLogin login)
    {
      //do what you like here
    }
    

    发生的事情是 eventtaggregator 被传递给两个视图模型。 ViewModel1 发布一条消息,但不知道谁(如果有人)正在收听它。 ViewModel2 已订阅该事件并正在监听发布者向其发送消息。

    使用这种方法,您可以让视图模型进行通信,而无需它们相互引用。

    【讨论】:

      猜你喜欢
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-22
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      • 2011-11-07
      相关资源
      最近更新 更多