Select node in treeView on right click MVVM

前端 未结 2 588
孤街浪徒
孤街浪徒 2021-01-13 09:12

I want to select a node of tree view on right click. I am using MVVM pattern and don\'t want to achieve this in code behind. Here is my XAML for tree view.

&         


        
2条回答
  •  无人共我
    2021-01-13 09:28

    You could define a DependencyProperty. Below I have shared a sample app which uses a dependency property to achieve this.

    TreeViewExtension.cs

    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Input;
    using System.Windows.Media;
    
    namespace WpfApplication1
    {
        public static class TreeViewExtension
        {
            public static readonly DependencyProperty SelectItemOnRightClickProperty = DependencyProperty.RegisterAttached(
               "SelectItemOnRightClick",
               typeof(bool),
               typeof(TreeViewExtension),
               new UIPropertyMetadata(false, OnSelectItemOnRightClickChanged));
    
            public static bool GetSelectItemOnRightClick(DependencyObject d)
            {
                return (bool)d.GetValue(SelectItemOnRightClickProperty);
            }
    
            public static void SetSelectItemOnRightClick(DependencyObject d, bool value)
            {
                d.SetValue(SelectItemOnRightClickProperty, value);
            }
    
            private static void OnSelectItemOnRightClickChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                bool selectItemOnRightClick = (bool)e.NewValue;
    
                TreeView treeView = d as TreeView;
                if (treeView != null)
                {
                    if (selectItemOnRightClick)
                        treeView.PreviewMouseRightButtonDown += OnPreviewMouseRightButtonDown;
                    else
                        treeView.PreviewMouseRightButtonDown -= OnPreviewMouseRightButtonDown;
                }
            }
    
            private static void OnPreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
            {
                TreeViewItem treeViewItem = VisualUpwardSearch(e.OriginalSource as DependencyObject);
    
                if (treeViewItem != null)
                {
                    treeViewItem.Focus();
                    e.Handled = true;
                }
            }
    
            public static TreeViewItem VisualUpwardSearch(DependencyObject source)
            {
                while (source != null && !(source is TreeViewItem))
                    source = VisualTreeHelper.GetParent(source);
    
                return source as TreeViewItem;
            }
        }
    }
    

    XAML:

    
        
            
                
                
    
                
                
                    
                        
                        
                    
                
            
        
    
    

提交回复
热议问题