xaml代码:
<TreeView Grid.Row="0" Height="401" HorizontalAlignment="Left" Margin="12,0,0,0" Name="treeView1" VerticalAlignment="Top" Width="182">
<TreeViewItem Header="哈哈" >
<TreeViewItem Header="呵呵"/>
<TreeViewItem Header="嘿嘿" />
<TreeViewItem Header="哈哈哈哈" />
</TreeViewItem>
<TreeViewItem Header="呵呵0">
<TreeViewItem Header="呵呵呵呵1" />
<TreeViewItem Header="呵呵呵呵呵呵2" />
</TreeViewItem>
<TreeView.ContextMenu>
<ContextMenu>
<MenuItem Header="点我" Name="miClickMe" />
<MenuItem Header="别点我" Name="miDontClickMe"/>
</ContextMenu>
</TreeView.ContextMenu>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseMove">
<i:InvokeCommandAction Command="{Binding SelectTreeNodeCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=local:Window1}}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</TreeView>
ViewModel代码:
public ICommand SelectTreeNodeCommand
{
get
{
return new DelegateCommand<object>((x) =>
{
if (x == null) { return; }
(x as Window1).MouseRightButtonDown += ViewModel_MouseRightButtonDown;
});
}
}
private void ViewModel_MouseRightButtonDown(object sender, RoutedEventArgs e)
{
var treeViewItem = VisualUpwardSearch<TreeViewItem>(e.OriginalSource as DependencyObject) as TreeViewItem;
if (treeViewItem != null)
{
treeViewItem.Focus();
}
}
private static DependencyObject VisualUpwardSearch<M>(DependencyObject source)
{
while (source != null && source.GetType() != typeof(M))
{
if (source is System.Windows.Media.Visual || source is System.Windows.Media.Media3D.Visual3D)
source = System.Windows.Media.VisualTreeHelper.GetParent(source);
else
source = LogicalTreeHelper.GetParent(source);
}
return source;
}
参考链接: