2009-02-27 2 views
0

나는에 의해 정의 된 4 수준의 트리 구조가 있습니다HierarchicalDataTemplate 항목을 TreeViewItem 내부에 자동으로 래핑 할 수 있습니까?

<HierarchicalDataTemplate DataType="{x:Type src:Level1}" ItemsSource="{Binding Path=Level2Items}"> 
    <TextBlock Text="{Binding Path=Level1Name}"/> 
</HierarchicalDataTemplate> 

<HierarchicalDataTemplate DataType="{x:Type src:Level2}" ItemsSource="{Binding Path=Level3Items}"> 
    <TextBlock Text="{Binding Path=Level2Name}"/> 
</HierarchicalDataTemplate> 

<HierarchicalDataTemplate DataType="{x:Type src:Level3}" ItemsSource="{Binding Path=Level4Items}"> 
    <TextBlock Text="{Binding Path=Level3Name}"/> 
</HierarchicalDataTemplate> 
<DataTemplate DataType="{x:Type src:Level4}"> 
    <TextBlock Text="{Binding Path=Level4Name}"/> 
</DataTemplate> 

을 그리고 그것은 잘 작동합니다. 유일한 것은 TreeViewItem 유형이 아니기 때문에 프로그래밍 방식으로 내 바운드 항목을 선택할 수 없다는 것입니다 (따라서 "IsSelected"속성이 없음). 데이터 바인딩 된 항목을 특정 컨테이너 유형 (이 경우 : TreeViewItem)에 자동으로 래핑하는 방법이 있습니까?

답변

3

상품이 TreeView 인 경우 TreeViewItemContainerGenerator에 의해 자동으로 TreeViewItem으로 포장됩니다. 당신은 당신의 데이터 클래스에 속성에 TreeViewItem지도에 IsSelected 재산을 보장하기 위해이 같은 작업을 수행 할 수 있습니다

<TreeView> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="TreeViewItem"> 
      <Setter Property="IsSelected" Value="{Binding MyIsSelectedProperty}"/> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 
+0

불행하게도, 바인딩 항목은 TreeViewItem 안에 자동으로 포장됩니다 당신의 가정은 (내 경우에는 사실이 아니다 이유가 무엇이든지). TreeView의 Items 컬렉션의 첫 번째 항목에서 GetType()을 호출하면 "TreeViewItem"유형이 아닌 내 유형이 반환됩니다. 이견있는 사람? 감사!! – Pwninstein

+0

Items 컬렉션에는 예상 한대로 항목이 포함되어 있습니다. 그러나 시각적 트리는 컨테이너에 항목을 래핑합니다. TreeViews의 경우 컨테이너는 TreeViewItem입니다. –

+0

켄트는 정확합니다. 각 항목은 ItemContainer에 래핑되며 ItemContainerStyle 속성으로 설명됩니다. TreeView의 경우 기본 컨테이너는 TreeViewItem입니다. Dr. WPF의 ItemContainers 블로그 게시물을 확인하십시오. http://drwpf.com/blog/Home/tabid/36/EntryID/32/Default.aspx – Adrian

관련 문제