从另一个viewmodel更新一个ViewModel属性

时间:2013-09-08 08:02:34

标签: wpf mvvm-light

我正在使用MVVM光源处理MVVM应用程序。这里我有2个视图和相关的ViewModel,如Header和Orders

 public ObservableCollection<HeaderViewModel> HeaderControls
    {
        get { return _header ?? (_header = new ObservableCollection<HeaderViewModel>()); }
    }

    public ObservableCollection<object> ViewControls
    {
        get { return _viewControls ?? (_viewControls = new ObservableCollection<object>()); }
    }

我在可观察集合中加载这些ViewModel以加载相关视图。

  private void LoadControls()
    {
        this.HeaderControls.Clear();
        var headerViewModel = new HeaderViewModel();
        this.HeaderControls.Add(headerViewModel);

        this.ViewControls.Clear();
        var orderViewModel = new OrdersViewModel();
        this.ViewControls.Add(orderViewModel);
    }

现在,OrderViewModels具有很少的属性,如文本字段,网格,我想通过点击HeaderViewModel上的图标来更新。

我也尝试过发布的解决方案,但它没有帮助:Accessing Properties in other ViewModels in MVVM Light

1 个答案:

答案 0 :(得分:0)

模型&lt; - &gt; VM&lt; - &gt;视图之间的MVVM Light中的通信通常是通过Messenger类。

简而言之,Messenger允许您从一个类向另一个类发送“消息”(可能是字符串,int,几乎任何类型)。接收者订阅接收这些消息(基于它想要获得的消息类型或者通过谁发送它和类型的组合)。同样,发件人也可以只向特定的其他类或订阅该消息类型的任何人发送消息。

Messenger的一个主要优点是它基于弱依赖性,因此您不必在VM&lt; - &gt; View之类的东西之间创建强依赖关系,从而保持对MVVM原则的忠诚。它也有详细记录,您应该能够从以下链接获得“如何使用它”的充分帮助:

MVVM Light - what's the Messenger?

MVVM Light Toolkit Messenger V2

or even this answer

正如我在该答案中提到的,下载示例中显示的一个概念是“具有自定义消息类型OpenWindowMessage的Messenger类使用”。您可以看到发送的消息是如何自定义类型以及VM如何订阅/发送和处理这些消息。

<强>侧面说明:

从你发布的代码来看,这很难说是肯定的,但你创建一个ObservableCollection<object> ViewControls似乎很奇怪。我看到你正在为它添加OrdersViewModel,所以为什么只为集合OrdersViewModel提供类型,甚至ViewModelBase。无论如何,你的所有VM都应继承ViewModelBase