Первоначально я использовал метод расширения в TreeView, который принимает UIElement - отправителя события PreviewMouseDown - как это:
private void MyTreeView_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
var uiElement = sender as UIElement;
var treeViewItem = myTreeView.TreeViewItemFromChild(uiElement);
}
Вот метод расширения (он проверяет самого ребенка в случае, если вы нажали прямо на TreeViewItem напрямую) ...
public static TreeViewItem TreeViewItemFromChild(this TreeView treeView, UIElement child)
{
UIElement proposedElement = child;
while ((proposedElement != null) && !(proposedElement is TreeViewItem))
proposedElement = VisualTreeHelper.GetParent(proposedElement) as UIElement;
return proposedElement as TreeViewItem;
}
Обновление:
Однако с тех пор я перешел на более общую версию, которую я могу использовать где угодно.
public static TAncestor FindAncestor<TAncestor>(this UIElement uiElement)
{
while ((uiElement != null) && !(uiElement is TAncestor))
retVal = VisualTreeHelper.GetParent(uiElement) as UIElement;
return uiElement as TAncestor;
}
Это либо находит искомый тип (опять же, включая саму проверку), либо возвращает ноль
Вы бы использовали его в том же обработчике PreviewMouseDown, как ...
private void MyTreeView_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
var uiElement = sender as UIElement;
var treeViewItem = uiElement.FindAncestor<TreeViewItem>();
}
Это очень удобно, когда мой TreeViewItem имеет CheckBox в своем шаблоне, и я хотел выбрать элемент, когда пользователь установил флажок, который обычно глотает событие.
Надеюсь, это поможет!