2014-01-14 20 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> 

放在UserControl.Resources时,此工作(结合为isExpanded与应用树型视图样式做

DataTemplate用于下面的Xaml片段,上面给出的数据模板用于执行数据转换。Documents是已正确绑定的FolderItems的可观察列表。

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

两个DataTemplates都显示文件树。但在第二种情况下,对于IsExpanded没有约束力(双向或其他)。

没有展示DataTemplating为的FileItem的这是FolderItem的叶节点..

回答

8

问题是TreeViewItem实际上是使用由TreeView本身的包装。它不需要(也不应该)成为您的DataTemplate的一部分,因为您现在正在创建TreeViewItemTreeViewItem(外部一个由TreeView创建,内部是模板的一部分)。

这就是为什么你的风格的作品,因为它被应用到所有TreeViewItem S,两个,你宣布一个(这最终没有意义)和由TreeView创建的。

你应该做的是更换您的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。在示例中不显示,是树视图也有一个ItemTemplate,它优先于DataTemplate。但是你是正确的:在TreeView控件将TreeViewItem包装器放在数据模板对象周围之前发生数据模板化,并且TreeViewItem(与其他控件不同)不检查它是否已经是TreeViewItem。谢谢。被你正确指出的一个重要的误解所蒙蔽。 –