2014-01-14 22 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。謝謝。被你正確指出的一個重要的誤解所矇蔽。 –