TreeView.SelectItem 默认右键选中不了的。
在普通xaml/cs模式下可以用这种方式来通过右键设置TreeView的SelectItem: private void treeview_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
var treeViewItem = e.Source as TreeViewItem;
if (treeViewItem != null)
{
treeViewItem.Focus();
e.Handled = true;
}
}
但是这个种方式在mvvm下不适用treeViewItem 获取到是null , e.Source实际上是TreeView本身,因为我是用ItemSource="Binding ObvList"这样的方式设置数据源。 右键获取不了TreeViewItem了 有什么解决办法没, 求指教。
在普通xaml/cs模式下可以用这种方式来通过右键设置TreeView的SelectItem: private void treeview_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
var treeViewItem = e.Source as TreeViewItem;
if (treeViewItem != null)
{
treeViewItem.Focus();
e.Handled = true;
}
}
但是这个种方式在mvvm下不适用treeViewItem 获取到是null , e.Source实际上是TreeView本身,因为我是用ItemSource="Binding ObvList"这样的方式设置数据源。 右键获取不了TreeViewItem了 有什么解决办法没, 求指教。
{
#region xaml/cs下右键选中方案
//var treeViewItem = e.Source as TreeViewItem;
//if (treeViewItem != null)
//{
// treeViewItem.Focus();
// e.Handled = true;
//}
#endregion #region mvvm模式下右键选中方案
SelectItemByRightClickOfMvvm(treeview);
#endregion
} public TreeViewItem SelectItemByRightClickOfMvvm(ItemsControl source)
{
if (!(source is TreeView) && !(source is TreeViewItem))
{
throw new ArgumentException("只支持参数为TreeView或者TreeViewItem", "source");
}
foreach (object item in source.Items)
{
TreeViewItem currentItem = source.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
Point mousePosition = Mouse.GetPosition(currentItem);
Rect itemRect = VisualTreeHelper.GetDescendantBounds(currentItem);
// 可能是选中的项,也可能是选中项的父节点
if (itemRect.Contains(mousePosition))
{
// 看看是不是它的孩子被选中了,否则就是它自己被选中了
if (currentItem.IsExpanded)
{
// 只判断展开的项
TreeViewItem selectedItem = SelectItemByRightClickOfMvvm(currentItem);
if (selectedItem != null)
{
selectedItem.IsSelected = true;
return selectedItem;
}
}
currentItem.IsSelected = true; return currentItem;
}
}
return null;
}
一个递归, 搞定~