2011-11-08 10 views
3

カテゴリを持つWPFでTreeViewを構築しようとしています。Databind複合型とサブツリーTreeViewItemsを混在させたWPF TreeView

基本的な構造は次のようになります。

Root 
|_ 
| Cat A 
|_ 
| Cat B 
|_ 
    Cat C 

各カテゴリは、別々の観察可能なコレクションにバインドされています。私のカテゴリのほとんどはとてもシンプルです。カテゴリであるTreeViewItemにはItemsSourceが設定されており、階層はありません。しかし、私は特別な階層で表現される必要のあるカテゴリを持っています。上記ツリー内の「猫C」は、このようになっていること

画像:

Servers 
    |_ 
    | [SERVER A's DISPLAY NAME] 
    | |_ 
    | | Namespaces 
    | | |_ 
    | |_ [NAMESPACE alpha's DISPLAY NAME] 
    | | Deployments 
    | | |_ 
    | |_ [DEPLOYMENT 1's DISPLAY NAME] 
    |_ Configuration File 
    [SERVER B's DISPLAY NAME] 

基本的に、私が欲しいのは、静的なヘッダを持っているハードコーディングされた親ツリービューアイテムです。そのアイテムには、名前が表示されたアイテムのコレクションがあります。元の親の各子には、動的な子供のリストを持つ3つの静的項目が必要です。

これを書くと、これは解決するのが非常に単純な問題であると私は考えます。しかし、XAMLで数日間プレイした後は、階層を取得することができません。以下は私が得ることができた最も遠いものです。私は、名前空間、デプロイメント、および設定ファイルを1つのコレクションに入れるために、Childrenという複合コレクションを使用しました。しかし、私はそれらを分離することはできません。あなたがしたい場所マイク、静的およびモデルデータをミキシング

はおそらくあなたを得ることはありません

<TreeViewItem ItemsSource="{Binding Path=Configuration.Servers}" 
         IsExpanded="True" > 
      <TreeViewItem.ItemContainerStyle> 
       <Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource {x:Type TreeViewItem}}"> 
        <Setter Property="IsExpanded" Value="True"/> 
       </Style> 
      </TreeViewItem.ItemContainerStyle> 

      <TreeViewItem.HeaderTemplate> 
       <DataTemplate> 
        <Border Margin="0,2,2,0"> 
         <StackPanel Orientation="Horizontal"> 
          <Image Source="/WPF;component/Images/server_chart.png" 
            Margin="0,0,5,0"/> 
          <TextBlock Text="Cognos Servers" /> 
         </StackPanel> 
        </Border> 
       </DataTemplate> 
      </TreeViewItem.HeaderTemplate> 

      <TreeViewItem.Resources> 
       <HierarchicalDataTemplate ItemSource="{Binding Path=Children}" DataType="{x:Type local:Server}"> 
        <HierarchicalDataTemplate.ItemContainerStyle> 
         <Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource {x:Type TreeViewItem}}" > 
          <Setter Property="IsExpanded" Value="True"/> 
         </Style> 
        </HierarchicalDataTemplate.ItemContainerStyle> 
        <TextBlock Text="{Binding DisplayName}" PreviewMouseRightButtonDown="OnPreviewMouseRightButtonDown"> 
         <TextBlock.ContextMenu> 
          <ContextMenu> 
           <MenuItem Header="Refresh" Click="TreeItemMenu_AddNewClient"> 
            <MenuItem.Icon> 
             <Image Source="/WPF;component/Images/arrow_refresh.png" /> 
            </MenuItem.Icon> 
           </MenuItem> 
           <MenuItem Header="Add Client..." Click="TreeItemMenu_AddNewClient" /> 
           <Separator /> 
           <MenuItem Header="Remove" Click="TreeItemMenu_RemoveClick"> 
            <MenuItem.Icon> 
             <Image Source="/WPF;component/Images/server_delete.png" /> 
            </MenuItem.Icon> 
           </MenuItem> 
          </ContextMenu> 
         </TextBlock.ContextMenu> 
        </TextBlock> 
       </HierarchicalDataTemplate> 

       <HierarchicalDataTemplate ItemsSource="{Binding Clients}" DataType="{x:Type local:Namespace}"> 
        <HierarchicalDataTemplate.ItemContainerStyle> 
         <Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource {x:Type TreeViewItem}}" > 
          <Setter Property="IsExpanded" Value="True"/> 
         </Style> 
        </HierarchicalDataTemplate.ItemContainerStyle> 
        <TextBlock Text="{Binding DisplayName}" PreviewMouseRightButtonDown="OnPreviewMouseRightButtonDown" /> 
       </HierarchicalDataTemplate> 

       <DataTemplate DataType="{x:Type local:Client}"> 
        <TextBlock Text="{Binding DisplayName}" 
           ContextMenu="{StaticResource ResourceKey=ContextMenuTreeItem}" 
           PreviewMouseRightButtonDown="OnPreviewMouseRightButtonDown" /> 
       </DataTemplate> 
      </TreeViewItem.Resources> 

答えて

3

。静的ノードなどを含む実際のViewModelを作成する必要があります。 Josh Smith's TreeView ViewModel tutorialsを強くお勧めします。これは最初のものですが、詳細を見て回りましょう。彼はその主題に関して最も精通した開発者の一人です。私たちは彼の推薦に従って大成功を収めました。

+0

あなたは答えが正しいです。私はそこに半分あったと言うことができると思う。私は、分類された見出しのViewModelの作成に抵抗しました。分類された見出しを表すための一般的なモデルを作成した後は、より良い結果が得られました。まだ私が好きではないように清潔ではありませんが、現在は機能しています。 –

関連する問題