วิธีรับรายการทรีลอจิคัลที่มีออบเจ็กต์เทมเพลตข้อมูล

ฉันมีวัตถุชื่อ "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-s ที่ส่งคืนนั้นเหมือนกับที่ฉันพูดถึงก่อนหน้านี้: TextBlock และ Border, Grid และ ScrollViewer แต่มีบางอย่างที่น่าสนใจ - o พบ TreeViewItem จริง ๆ แล้ว HitTestResultCallback เรียกด้วย r นั่นคือ Grid (หนึ่งในผลการทดสอบ Hit ที่เขียนไว้ด้านบน) ดังนั้นสิ่งที่ฉันทำคือนำ o ที่พบเป็น TreeViewItem และเก็บไว้ในตัวแปรท้องถิ่นซึ่งจะเป็นค่าที่ส่งคืนของวิธีการตัดคำของโค้ดนี้ที่คุณให้ฉัน - person Yanko Pata; 23.01.2013