簡體   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