0

我是 WPF 和 MVVM 的新手,希望能帮助我解决以下问题:

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

想到的可能性有:

  1. 常规 .NET 事件
  2. PRISM 中的事件聚合
  3. 指挥
  4. 我不知道的其他选项。

请指导我,实施这种沟通的最佳方式是什么。

4

2 回答 2

0

我倾向于使用中介者模式(例如来自 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
};
于 2013-10-24T08:38:16.893 回答
0

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

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

public YourObjectType SelectedItem 
{
    get { return selectedItem; }
    set 
    {
        selectedItem = value;
        NotifyPropertyChanged("SelectedItem"); // must implement INPC interface
        LoadObjectFromDatabase(selectedItem.Id);
     }
}

这样,每当此属性更改时,LoadObjectFromDatabase都可以向方法传递Id所选项目的唯一值。

于 2013-10-24T08:38:50.687 回答