繁体   English   中英

从另一个 ViewModel 使用 treeview 的 selectedItem

[英]Use selectedItem of treeview from another ViewModel

我是 MVVM/WPF 的新手,并尝试使用 MVVM 设计模式。 我不知道如何描述我的问题,但假设我有 2 个 ViewModel,如下图所示

在此处输入图像描述

RedViewModel 有一个 treeview。 当用户点击 treeview 时,它会获取 selectedItem 并发送到 BlueViewModel。 基于 RedViewModel 中的 selectedItem,BlueViewModel 在文本框中显示 selectedItem 的数据。

我不知道如何访问和使用 2 个 MVVM 之间的变量。

选项 1:红色和蓝色视图可以共享同一个视图 model。 然后他们可以简单地绑定到相同的属性。

选项 2:如果您想坚持使用单独的视图 model 类,您可以在使用事件聚合器或信使选择项目时从RedViewModelBlueViewModel发送松散耦合的消息。

如何在 MVVM WPF 应用程序中通知子视图事件的父视图?

选项 3:在两个视图模型中使用共享服务

您不能绑定到标准 WPF TreeViewSelectedItem 但是,您可以使用Beahvior class 创建可绑定属性

public class perTreeViewHelper : Behavior<TreeView>
{
    public object BoundSelectedItem
    {
        get => GetValue(BoundSelectedItemProperty);
        set => SetValue(BoundSelectedItemProperty, value);
    }

    public static readonly DependencyProperty BoundSelectedItemProperty =
        DependencyProperty.Register("BoundSelectedItem",
            typeof(object),
            typeof(perTreeViewHelper),
            new FrameworkPropertyMetadata(null,
                FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                OnBoundSelectedItemChanged));

    private static void OnBoundSelectedItemChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        if (args.NewValue is perTreeViewItemViewModelBase item)
        {
            item.IsSelected = true;
        }
    }

    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.SelectedItemChanged += OnTreeViewSelectedItemChanged;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.SelectedItemChanged -= OnTreeViewSelectedItemChanged;
        base.OnDetaching();
    }

    private void OnTreeViewSelectedItemChanged(object obj, RoutedPropertyChangedEventArgs<object> args)
    {
        BoundSelectedItem = args.NewValue;
    }
}

这样,您可以绑定到一个 ViewModel 上的属性,您可以从另一个 ViewModel 引用该属性。 显然,这两个 ViewModel 需要以某种方式链接——通常是通过将一个作为另一个的属性。

更多关于我在我的博客文章中的 WPF/MVVM 上下文中对 TreeViews 的看法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM