zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Linux下校验下载文件的完整性(MD5,SHA1,PGP)
    十六进制字节 & 十六进制转二进制
    session & cookie
    php与mysql的链接到底用mysql 还是mysqli,pdo
    php连接数据库时候的字符集设置
    Prepared statements(mysqli & pdo)
    shell脚本中执行mysql命令
    centos系统字符编码问题
    实用crontab命令
    shell获取用户输入
  • 原文地址:https://www.cnblogs.com/xcong/p/3712898.html
Copyright © 2011-2022 走看看