• WPF MVVM TreeView 实现 右键选中 右键菜单


    1.非MVVM模式:下载源代码WpfApplication1.zip 

    <TreeView Height="200" PreviewMouseRightButtonDown="TreeViewItem_PreviewMouseRightButtonDown" HorizontalAlignment="Left" Margin="12,0,0,0" Name="treeView1" VerticalAlignment="Top" Width="120">
                <TreeViewItem Header="哈哈">
                    <TreeViewItem Header="呵呵"/>
                    <TreeViewItem Header="嘿嘿" />
                    <TreeViewItem Header="哈哈哈哈" />
                </TreeViewItem>
                <TreeViewItem Header="呵呵">
                    <TreeViewItem Header="呵呵呵呵" />
                    <TreeViewItem Header="呵呵呵呵呵呵" />
                </TreeViewItem>
                <TreeView.ContextMenu>
                    <ContextMenu>
                        <MenuItem Header="点我" Name="miClickMe" Click="miClickMe_Click"/>
                        <MenuItem Header="别点我" Name="miDontClickMe" Click="miDontClickMe_Click"/>
                    </ContextMenu>
                </TreeView.ContextMenu>
            </TreeView>
    XAML
      private void TreeViewItem_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
            {
                var treeViewItem = VisualUpwardSearch<TreeViewItem>(e.OriginalSource as DependencyObject) as TreeViewItem;
                if (treeViewItem != null)
                {
                    treeViewItem.Focus();
                    e.Handled = true;
                }
            }
    
            static DependencyObject VisualUpwardSearch<T>(DependencyObject source)
            {
                while (source != null && source.GetType() != typeof(T))
                    source = VisualTreeHelper.GetParent(source);
    
                return source;
            }
    
            private void miClickMe_Click(object sender, RoutedEventArgs e)
            {
                var node = treeView1.SelectedItem as TreeViewItem;
                MessageBox.Show("点我" + node.Header);
            }
    
            private void miDontClickMe_Click(object sender, RoutedEventArgs e)
            {
                var node = treeView1.SelectedItem as TreeViewItem;
                MessageBox.Show("别点我" + node.Header);
            }
    C#

    2.MVVM模式: 下载源代码MVVM模式.zip

    1)添加引用:System.Windows.Interactivity.dll。

      添加引用→程序集→扩展。 dll

    2)添加MVVMLight引用:GalaSoft.MvvmLight.Extras.WPF4.dll dll

    3)添加Prism框架引用:Microsoft.Practices.Prism.dll 下载dll

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
                 xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WPF4"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <TreeView Height="200" HorizontalAlignment="Left" Margin="12,0,0,0" Name="treeView1" VerticalAlignment="Top" Width="120">
                <TreeViewItem Header="哈哈">
                    <TreeViewItem Header="呵呵"/>
                    <TreeViewItem Header="嘿嘿" />
                    <TreeViewItem Header="哈哈哈哈" />
                </TreeViewItem>
                <TreeViewItem Header="呵呵">
                    <TreeViewItem Header="呵呵呵呵" />
                    <TreeViewItem Header="呵呵呵呵呵呵" />
                </TreeViewItem>
                <TreeView.ContextMenu>
                    <ContextMenu>
                        <MenuItem Header="点我" Name="miClickMe" />
                        <MenuItem Header="别点我" Name="miDontClickMe"/>
                    </ContextMenu>
                </TreeView.ContextMenu>
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="PreviewMouseRightButtonDown">
                        <cmd:EventToCommand Command="{Binding SelectTreeNodeCommand}" PassEventArgsToCommand="True" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </TreeView>
        </Grid>
    </Window>
    XAML
    public class MainViewModel:NotificationObject
        {
            public ICommand SelectTreeNodeCommand { get; set; }
    
            public MainViewModel()
            {
                SelectTreeNodeCommand = new DelegateCommand<RoutedEventArgs>(SelectTreeNodeCommandExec);
            }
    
            private void SelectTreeNodeCommandExec(RoutedEventArgs e)
            {
                var treeViewItem = VisualUpwardSearch<TreeViewItem>(e.OriginalSource as DependencyObject) as TreeViewItem;
    
                if (treeViewItem == null) return;
                treeViewItem.Focus();
                e.Handled = true;
            }
    
            private static DependencyObject VisualUpwardSearch<M>(DependencyObject source)
            {
                while (source != null && source.GetType() != typeof(M))
                {
                    if (source is Visual || source is Visual3D)
                        source = VisualTreeHelper.GetParent(source);
                    else
                        source = LogicalTreeHelper.GetParent(source);
                }
                return source;
            }
    
        }
    ViewModel
  • 相关阅读:
    SEO(Business)
    C#数组去掉重复的元素
    文件创建与文件格式的修改
    Filter(20160815)
    OmniGraffle导入stencils的两个方法以及优质的stencils下载网站推荐
    在Axure RP 8.0 中使用 Font Awesome 图标库完成设计并能在其他未安装该字体的电脑离线预览的方法
    社会性动物(艾略特•阿伦森)
    MacTex 在XeLaTex编译状态下插入的pdf格式图片无法显示问题的解决方案
    Markdown,别来无恙!
    男人来自火星 女人来自金星(约翰·格雷)
  • 原文地址:https://www.cnblogs.com/xcong/p/3712898.html
Copyright © 2020-2023  润新知