2014-01-14 14 views
5

WPFデータバインディングでいくつかの本質的な概念が欠けているような気がします。私のバインディングが私にとってうまくいくかどうかは、いつものことです。TreeViewItem.IsExpandedにバインドします。なぜこれは機能しますか?

この例では、TreeViewItemのIsExpandedプロパティをバインドされたオブジェクトの対応するプロパティに双方向でバインドしたいとします。これは最初の例で動作します。それは第二のものではありません。

誰でも理由を説明できますか?私はなぜ2番目のバージョンが動作しないのか理解できません。私ができれば悲しみを救うことはできないと思う。

UserControl.Resourcesに配置されたとき、これは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> 

DataTemplateは、上記のデータテンプレートを使用して、次のXamlフラグメントで使用されます。ドキュメントは、正しくバインドされたFolderItemの観測可能リストです。

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

両方のデータテンプレートがファイルツリーを示します。しかし、2番目のケースでは、IsExpandedのバインド(双方向またはその他)はありません。

FileItemののFolderItemののリーフノードであるためDataTemplatingされることが示されていない

..

答えて

8

問題はTreeViewItemが実際TreeView自身によって使用されているラッパーであるということです。 DataTemplateの一部である必要はありません。TreeViewItem内にTreeViewItemを作成しています(外側はTreeViewで作成され、内側はテンプレートの一部です)。なぜあなたのスタイルの作品、それがすべてTreeViewItem S、(無意味されて終わる)あなたが宣言しているものとTreeViewによって作成された1両方に適用されますよう

これは、あります。 (残念ながら、私は現時点でテストすることはできませんが、それは少なくともあなたは正しい方向に向かって取得する必要があります)

<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> 

:あなたは何をすべき

は、これであなたのDataTemplateを置き換えるです。

あなたのスタイルを現状のままにして、プロパティのバインドを続行します。

+2

Arg。この例では示されていませんでしたが、TreeViewにもItemTemplateがあり、これはDataTemplateよりも優先されます。しかし、あなたは正しいです:データテンプレートは、TreeViewコントロールがTreeViewItemラッパーをデータテンプレートのオブジェクトの周りに置き、TreeViewItem(他のコントロールと違って)が既にTreeViewItemかどうかを確認しません。ありがとう。あなたが正しく指摘した、本質的な誤解で盲目になった。 –

関連する問題