在左窗格树视图模型和右窗格视图模型之间进行通信的最佳方式

时间:2013-10-24 06:56:01

标签: wpf mvvm

我是WPF和MVVM的新手,非常感谢您解决以下问题:

我有一个经典的Windows-explorer类型界面,左侧窗格中有一个树视图。就像在Josh Smith的treeview示例应用程序中一样,每个treeviewitem的viewmodel都会在视图中选中时通过双向绑定进行通知。用户希望在右窗格中看到与左窗格中所选树节点相关的一些信息。为此,需要通过所选treeviewitem的viewmodel通知右窗格的viewmodel。此通知中还应包含所选节点的唯一标识符,以便右窗格视图模型可以从数据库中提取正确的信息。这个特定的viewmodel-to-viewmodel通知工作的最佳方法是什么?

浮现在脑海中的可能性是:

  1. 常规.NET事件
  2. 事件汇总,如PRISM
  3. 指挥
  4. 我不知道的其他选项。
  5. 请指导我,实施此沟通的最佳方式是什么。

2 个答案:

答案 0 :(得分:0)

我倾向于使用Mediator模式(例如来自MVVM Light Libs的Messenger类)来解决这个问题。

public class SelectionChangedMessage : MessageBase
{
    public object SelectedItem { get; private set; }
    public string Id { get; private set; }

    public SelectionChangedMessage(object sender, object selectedItem, string id) : base(sender)
    {
        if (selectedItem == null) throw new ArgumentNullException("selectedItem");
        if (id == null) throw new ArgumentNullException("id");
        SelectedItem = selectedItem;
        Id = id;
    }
}

然后在左侧窗格中VM:

MessengerInstance.Send(new SelectionChangedMessage(this, SelectedItem, SelectedId));

在右侧窗格VM中:

MessengerInstance.Register<SelectionChangedMessage>(this, msg =>
{
    //Do stuff
};

答案 1 :(得分:0)

当没有提供代码示例时,总是很难回答问题(请记住以后的问题)。事实上,我所能做的就是做出假设。因此,考虑到这一点,正如您所说的那样每个treeviewitem的viewmodel都会在视图中选择时通过双向绑定通知,我将假设您有数据绑定它到TreeViewItem.IsSelected属性。

而不是(或同样)将TreeViewItem.IsSelected属性绑定到绑定到TreeView.ItemsSource的数据的集合中的单个对象视图模型的属性,您可以绑定{ {1}}属性到包含集合属性的父视图模型的属性:

TreeView.SelectedItem

这样,只要此属性发生更改,就可以为public YourObjectType SelectedItem { get { return selectedItem; } set { selectedItem = value; NotifyPropertyChanged("SelectedItem"); // must implement INPC interface LoadObjectFromDatabase(selectedItem.Id); } } 方法传递所选项目的唯一LoadObjectFromDatabase值。