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

 

posted @ 2014-05-07 00:31  xiaocong_soft  阅读(6438)  评论(0编辑  收藏  举报