首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >左窗格treeviewitem视图模型和右窗格视图模型之间通信的最佳方法

左窗格treeviewitem视图模型和右窗格视图模型之间通信的最佳方法
EN

Stack Overflow用户
提问于 2013-10-24 06:56:01
回答 2查看 131关注 0票数 0

我是WPF和MVVM的新手,希望在以下问题上提供帮助:

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

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

  1. 正则.NET事件
  2. 事件聚合,如PRISM中所示
  3. 指挥
  4. 其他我不知道的选择。

请指导我,什么是最好的方式来实现这一沟通。

EN

回答 2

Stack Overflow用户

发布于 2013-10-24 08:38:16

对于这样的问题,我倾向于使用Mediator模式(例如中的Messenger类)。

代码语言:javascript
复制
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中:

代码语言:javascript
复制
MessengerInstance.Send(new SelectionChangedMessage(this, SelectedItem, SelectedId));

在右窗格VM中:

代码语言:javascript
复制
MessengerInstance.Register<SelectionChangedMessage>(this, msg =>
{
    //Do stuff
};
票数 0
EN

Stack Overflow用户

发布于 2013-10-24 08:38:50

当没有提供代码示例时,回答问题总是很困难的(请记住这一点,以备以后的问题使用)。事实上,我所能做的就是做一些假设。因此,考虑到这一点,正如您已经说过的,每个treeviewitem的视图模型是通过双向绑定通知的,只要它在视图中被选中,我将假设您已经将其绑定到TreeViewItem.IsSelected属性。

与将TreeViewItem.IsSelected属性绑定到集合中绑定到TreeView.ItemsSource的单个对象视图模型的属性不同,您可以将TreeView.SelectedItem属性绑定到包含集合属性的父视图模型的属性:

代码语言:javascript
复制
public YourObjectType SelectedItem 
{
    get { return selectedItem; }
    set 
    {
        selectedItem = value;
        NotifyPropertyChanged("SelectedItem"); // must implement INPC interface
        LoadObjectFromDatabase(selectedItem.Id);
     }
}

这样,每当此属性发生更改时,就可以传递所选项的唯一Id值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19559011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档