0

У меня есть объект под названием «TextModel». Я определил для него HierarchicalDataTemplate.Как получить элемент логического дерева, который содержит объект с шаблоном данных

так:

<HierarchicalDataTemplate DataType="{x:Type local:TextModel}" 
          ItemsSource="{Binding Children}"> 
    <TextBlock x:Name="TextPresenter" 
      Text="{Binding Text}" 
      Style="{StaticResource TextModelStyleMouseOver}" /> 
</HierarchicalDataTemplate> 

Этот TextModel содержится в каждом TreeViewItem в моей TreeView. И, в коде, я использовал VisualTreeHelper.HitTest, чтобы получить TreeViewItem, на который я нажал, но это не дает мне TreeViewItem как один из результатов HitTest. Результатами HitTest являются: TextBlock (и Border, Grid и ScrollViewer) - тот, который я определил в HierarchicalDataTemplate.

Я попытался использовать LogicalTreeHelper.GetParent (textBlockFromTheHitTestResults), но он вернул мне нуль.

Спасибо за внимание!

ответ

0

HitTest имеет overload вы можете использовать для фильтрации результатов:

VisualTreeHelper.HitTest(
    root, 
    o => o is TreeViewItem ? HitTestFilterBehavior.ContinueSkipChildren : HitTestFilterBehavior.Continue, 
    r => 
     { 
      if (r.VisualHit is TreeViewItem) 
      { 
       DoSomethingWithTreeViewItem((TreeViewItem)r.VisualHit); 
       return HitTestResultBehavior.Stop; 
      } 

      return HitTestResultBehavior.Continue; 
     }, 
    new PointHitTestParameters(point)); 
+0

Возвращенных r.VisualHit-s такого же, как я уже говорил ранее: TextBlock и Border, Сетка и ScrollViewer. Но есть что-то интересное: o фактически находит TreeViewItem, но затем HitTestResultCallback, вызванный с r, который является Grid (один из результатов теста на удар, написанный выше). То, что я сделал, это взять o, найденный как TreeViewItem, и сохранить его в локальной переменной, которая будет возвращенным значением метода упаковки этого кода, который вы мне дали. –