2014-01-14 1 views
5

WPF 데이터 바인딩에서 필수 개념이 빠져있는 것처럼 느껴집니다. 제 바인딩이 저에게 효과가 있는지 여부는 언제나 맞습니다.TreeViewItem.IsExpanded에 바인딩. 왜이게 효과가 있니?

이 예제에서는 TreeViewItem의 IsExpanded 속성을 바인딩 된 개체의 해당 속성에 양방향으로 바인딩하려고합니다. 첫 번째 예에서 작동합니다. 그것은 둘째로하지 않습니다.

이유를 설명 할 수 있습니까? 두 번째 버전이 작동하지 않는 이유를 이해할 수 없습니다. 할 수만 있다면 슬픔을 덜어 줄 수 있다고 생각할 수 없습니다.

<Style TargetType="TreeViewItem"> 
     <Setter Property="IsExpanded" 
       Value="{Binding Path=IsExpanded, Mode=TwoWay}" /> 
    </Style> 
    <DataTemplate DataType="{x:Type viewModels:FolderItem}"> 
     <TreeViewItem ItemsSource="{Binding Folders}" 
      IsExpanded="{Binding Mode=TwoWay,Path=IsExpanded}" > 
      <TreeViewItem.Header> 
       <StackPanel Orientation="Vertical"> 
        <Image Source="{Binding IconSource}" 
          Width="16" Height="16" 
          Margin="4,0,4,0" VerticalAlignment="Center" /> 
        <TextBlock Text="{Binding Title}" 
          VerticalAlignment="Center" /> 
       </StackPanel> 
      </TreeViewItem.Header> 
     </TreeViewItem> 
    </DataTemplate> 

이) 데이터 템플릿으로 IsExpanded에 (직접 바인딩하지 않습니다 :

<DataTemplate DataType="{x:Type viewModels:FolderItem}"> 
     <TreeViewItem ItemsSource="{Binding Folders}" 
      IsExpanded="{Binding Path=IsExpanded,Mode=TwoWay}" > 
      <TreeViewItem.Header> 
       <StackPanel Orientation="Vertical"> 
        <Image Source="{Binding IconSource}" 
          Width="16" Height="16" Margin="4,0,4,0" 
          VerticalAlignment="Center" /> 
        <TextBlock Text="{Binding Title}" 
         VerticalAlignment="Center" /> 
       </StackPanel> 
      </TreeViewItem.Header> 
     </TreeViewItem> 
    </DataTemplate> 
(으로 IsExpanded에 바인딩

UserControl.Resources에 배치 할 때 작동

은 TreeViewItem에 적용되는 스타일로 이루어집니다

DataTemplate은 데이터 변환을 수행하는 데 사용 된 위에 제공된 데이터 템플릿을 사용하여 다음 Xaml 조각에서 사용됩니다. 문서는 올바르게 바인딩 된 FolderItems의 관찰 가능한 목록입니다.

<TreeView ItemsSource="{Binding Documents}" /> 

두 데이터 템플릿 모두 파일 트리를 보여줍니다. 그러나 두 번째 경우에는 IsExpanded에 바인딩 (양방향 또는 기타)이 없습니다.

FileItem의 FolderItem의의 리프 노드입니다있는 DataTemplating되어 표시되지 않음

..

답변

8

문제는 TreeViewItem 실제로 TreeView 자체에서 사용하는 래퍼 것입니다. DataTemplate의 일부일 필요는 없으며 TreeViewItem (외부는 TreeView으로 생성되고 내부는 템플릿의 일부 임) 내에 TreeViewItem을 생성 할 필요가 없습니다. 당신의 스타일이 작동하는 이유는, 에 (의미있는 끝) 당신이 선언하고있는 하나는 TreeView에 의해 생성 된 하나 둘 모두TreeViewItem의 적용됩니다로

이이다.

은 당신이 할 일은 대체 당신의 이와 DataTemplate :

<HierarchicalDataTemplate ItemsSource="{Binding Folders}"> 
    <StackPanel Orientation="Vertical"> 
     <Image Source="{Binding IconSource}" 
       Width="16" Height="16" Margin="4,0,4,0" 
       VerticalAlignment="Center" /> 
     <TextBlock Text="{Binding Title}" 
        VerticalAlignment="Center" /> 
<HierarchicalDataTemplate> 

(불행하게도 나는 순간에 테스트 할 수 없습니다,하지만 적어도 당신이 올바른 방향으로 향하고 얻어야한다).

스타일을 그대로 두어 속성 바인딩을 계속합니다.

+2

Arg. 예제에서 보이지는 않지만, TreeView에는 ItemTemplate이 있으며, 이는 DataTemplate보다 우선합니다. 하지만 당신은 맞습니다 : 데이터 템플릿 개체 주위에 TreeViewItem 래퍼를 넣고 TreeViewItem (다른 컨트롤과는 달리) TreeViewItem 이미 있는지 확인하지 않습니다 전에 데이터를 템플릿이 발생합니다. 감사. 당신이 올바르게 지적한 근본적인 오해가 눈이 먼 것. –