Как получить элемент логического дерева, содержащий объект шаблона данных

У меня есть объект под названием "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), но он вернул мне ноль.

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


person Yanko Pata    schedule 23.01.2013    source источник


Ответы (1)


HitTest имеет перегрузку, которую можно использовать для фильтрации результатов:

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));
person Kent Boogaart    schedule 23.01.2013
comment
Возвращаемые r.VisualHit-ы такие же, как я упоминал ранее: TextBlock и Border, Grid и ScrollViewer. Но есть кое-что интересное — o на самом деле находит TreeViewItem, но затем вызывается HitTestResultCallback с r, который является Grid (один из результатов теста на попадание, написанный выше). Итак, что я сделал, так это взял o, найденный как TreeViewItem, и сохранил его в локальной переменной, которая будет возвращаемым значением метода упаковки этого кода, который вы мне дали. - person Yanko Pata; 23.01.2013