2011-02-01 7 views
0

私はいくつかのノードを表示する必要があるWPFツリーを持っています。 EntityAとEntityBの2種類のエンティティがあるとします。これらの両方のエンティティは、共通のインタフェースIEntityを実装します。今、EntityAは、EntityB要素とEntityA要素のコレクションを持ちます。これをHierarchicalDataTemplateでどのように表示できますか?WPFツリーの階層データテンプレートに関する質問

私はEntityA型の要素を含む私のVM内の "DisplayItems"と呼ばれるObservableCollection()を公開しています。

EnittyAとEntityBの両方に、 "ItemCollection"というObservableCollectionが追加されます。 EntityAの場合、ItemCollectionリストには理想的にはEntityAおよびEntityB型のエンティティが含まれている必要があります。

次のように現在のHierarchicalDataTemplateと私が使用していますXAMLは次のとおりです。

<HierarchicalDataTemplate ItemsSource="{Binding Path=ItemCollection}" DataType="{x:Type Entities:EntityB}"> 
     <Grid> 
     <StackPanel Orientation="Horizontal" x:Name="compositeCT"> 
      <Image Source="/Images/EntityB.png" Width="15" Height="15"/> 
      <Label Foreground="Blue" Content="{Binding Path=Name}"/> 
      <Label Foreground="Black" Content=" = "/> 
      <Label Foreground="Blue" Content="{Binding Path=CompositeLabel}"/> 
     </StackPanel> 
     <StackPanel Orientation="Horizontal" x:Name="nCompositeCT"> 
      <Image Source="/Images/EntityB.png" Width="15" Height="15"/> 
      <TextBlock Foreground="Blue" Text="{Binding Path=Name}"/> 
     </StackPanel> 
<HierarchicalDataTemplate.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Foreground="Green" Text="{Binding}"/> 
     </DataTemplate> 
</HierarchicalDataTemplate.ItemTemplate> 
</HierarchicalDataTemplate> 

<HierarchicalDataTemplate ItemsSource="{Binding Path=ItemCollection}" DataType="{x:Type Entities:EntityA}"> 
     <StackPanel Orientation="Horizontal" > 
     <Image Source="/Images/ElementA.png" Margin="3" Width="15" Height="15" Focusable="False"/> 
     <TextBlock Foreground="Red" Text="{Binding Path = Name}" Focusable="False"/> 
     </StackPanel> 
    </HierarchicalDataTemplate> 

<TreeView x:Name="tvMyTree" 
      ItemsSource="{Binding DisplayItems}" 
      AllowDrop="True"   
      VirtualizingStackPanel.IsVirtualizing="True" 
      VirtualizingStackPanel.VirtualizationMode="Recycling" 
      ScrollViewer.IsDeferredScrollingEnabled="True" 
      Margin="5" 
      TreeViewItem.Expanded="OnTreeViewItemExpanded" 
      TreeViewItem.Selected="OnTreeViewItemSelected" 
     /> 
+0

が見えます –

答えて

0

あなたは大丈夫です2 HierarchicalDataTemplatesを定義することができます。そして、のTextBlockの代わりに私がItemTemplateSelectorが要件に完璧にフィットとし、あなたのエンティティAの他の特性に応じて必要は複雑なものは何でも可視化置き、EntityB

 <HierarchicalDataTemplate DataType="{x:Type local:EnittyA}" ItemsSource="{Binding ItemCollection}" > 
      <TextBlock Text="{Binding Name}"/> 
     </HierarchicalDataTemplate> 
     <HierarchicalDataTemplate DataType="{x:Type local:EnittyB}" ItemsSource="{Binding ItemCollection}" > 
      <TextBlock Text="{Binding Name}"/> 
     </HierarchicalDataTemplate> 
0

ことができます。 ItemTemplateSelectorは継承されているので、テンプレートのエンドポイント受信者を気にする必要はありません。レシーバ(アイテムコンテナは)ちょうどセレクタに対応し、最後の1は、データ型に応じて適切なテンプレートを返します。

public class LayoutItemTemplateSelectorItem 
{ 
    public Type TargetType 
    { 
     get; 
     set; 
    } 
    public DataTemplate Template 
    { 
     get; 
     set; 
    } 
} 
[ContentProperty("Items")] 
public class LayoutItemTemplateSelector : DataTemplateSelector 
{ 
    public LayoutItemTemplateSelector() 
    { 
     this.Items = new Collection<LayoutItemTemplateSelectorItem>(); 
    } 
    public Collection<LayoutItemTemplateSelectorItem> Items 
    { 
     get; 
     private set; 
    } 
    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     var component = (LayoutItem)item; 
     var typeToSearch = component.GetType(); 

     var foundItem = this.Items 
      .Where(i => i.TargetType == typeToSearch) 
      .FirstOrDefault(); 

     if (foundItem != null) 
     { 
      return foundItem.Template; 
     } 

     throw new Exception(string.Format(Properties.Resources.AppropriateTemplateNotFound, typeToSearch.FullName)); 
    } 
} 

XAMLでの使用法:あなたのXAMLコードが正しく貼り付けられますdidntのよう

<UserControl ...> 
    <UserControl.Resources> 
     <ResourceDictionary> 

      <HierarchicalDataTemplate x:Key="EntityBTemplate" 
             ItemsSource="{Binding Path=ItemCollection}" 
             DataType="{x:Type Entities:EntityB}"> 
       ... 
      </HierarchicalDataTemplate> 

      <HierarchicalDataTemplate x:Key="EntityATemplate" 
             ItemsSource="{Binding Path=ItemCollection}" 
             DataType="{x:Type Entities:EntityA}"> 
       ... 
      </HierarchicalDataTemplate> 

      <LayoutItemTemplateSelector x:Key="TemplateSelector"> 
       <LayoutItemTemplateSelectorItem TargetType="{x:Type EntityA}" 
               Template="{StaticResource EntityATemplate}"/> 
       <LayoutItemTemplateSelectorItem TargetType="{x:Type EntityB}" 
               Template="{StaticResource EntityBTemplate}"/> 
      </LayoutItemTemplateSelector> 
     </ResourceDictionary> 
    </UserControl.Resources> 
<Grid> 
    <TreeView ItemsSource="{Binding DisplayItems}" 
       ItemTemplateSelector="{StaticResource TemplateSelector}"/> 
</Grid> 
</UserControl> 
関連する問題