2012-02-03 8 views
4

TreeViewでは、2つの異なるクラスをバインディングに使用します。たとえば、私はChildGroupを持つことができ、Itemsを持つことができるグループを持っています。このクラスの コード例:テンプレートIsSelectedとTreeViewで使用する2つのタイプのTreeViewItemテンプレートの変更

<Grid> 
    <TreeView Name="treeView"> 
     <TreeView.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type WpfApplication1:Group}" 
             ItemsSource="{Binding AllItems}"> 
       <TextBlock Text="{Binding Name}"/> 
      </HierarchicalDataTemplate> 
      <DataTemplate DataType="{x:Type WpfApplication1:Item}"> 
       <TextBlock Text="{Binding ItemName}" FontStyle="Italic"/> 
      </DataTemplate> 
     </TreeView.Resources> 
    </TreeView> 
</Grid> 

次私が使用してツリービューにバインドする

using System.Collections.Generic; 
using System.Collections.ObjectModel; 

namespace WpfApplication1 
{ 
public class Group 
{ 
    public Group(string name) 
    { 
     Name = name; 
     items = new ObservableCollection<Item>(); 
     groups = new ObservableCollection<Group>(); 
    } 
    public string Name { get; 
     set; 
    } 

    private ObservableCollection<Item> items; 
    private ObservableCollection<Group> groups; 

    public ObservableCollection<Item> Items 
    { 
     get { return items; } 
    } 


    public ObservableCollection<Group> Groups 
    { 
     get { return groups; } 
    } 

    public IEnumerable<object> AllItems 
    { 
     get 
     { 
      foreach (var group in groups) 
      { 
       yield return group; 
      } 
      foreach (var item in items) 
      { 
       yield return item; 
      } 
     } 
    } 

} 

public class Item 
{ 
    public Item(string name) 
    { 
     ItemName = name; 
    } 

    public string ItemName 
    { 
     get; 
     set; 
    } 
} 
} 

それは簡単です。

問題が選択されているときにItemTemplateを変更する必要があるという問題があります。そして、選択されたItemクラスだけを変更する必要があります。

1つのクラスだけがバインディングに使用する場合、私はそれを行うことができます。また、スタイルとトリガーを使用すると簡単です:

<TreeView Name="treeView1" Grid.Column="1"> 
     <TreeView.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type WpfApplication1:Group}" 
             ItemsSource="{Binding AllItems}" 
             x:Key="groupTemplate"> 
       <TextBlock Text="{Binding Name}"/> 
      </HierarchicalDataTemplate> 
      <HierarchicalDataTemplate DataType="{x:Type WpfApplication1:Group}" 
             ItemsSource="{Binding AllItems}" 
             x:Key="selectedGroupTemplate"> 
       <TextBlock Text="{Binding Name}" FontStyle="Italic" FontWeight="Bold" FontSize="14"/> 
      </HierarchicalDataTemplate> 
     </TreeView.Resources> 

     <TreeView.ItemContainerStyle> 
      <Style TargetType="{x:Type TreeViewItem}"> 
       <Setter Property="HeaderTemplate" Value="{StaticResource groupTemplate}"/> 
       <Style.Triggers> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="HeaderTemplate" Value="{StaticResource selectedGroupTemplate}"/> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </TreeView.ItemContainerStyle> 
    </TreeView> 

しかし、私はマルチクラスバインディングに問題があります。

SelectedItemテンプレートを変更してから、マルチクラスバインディングを使用するにはどうすればできますか?何か案は?

サンプルの後ろに私のコード:

using System.Collections.ObjectModel; 
using System.Windows; 

namespace WpfApplication1 
{ 
/// <summary> 
/// Interaction logic for Window2.xaml 
/// </summary> 
public partial class Window2 : Window 
{ 
    private ObservableCollection<Group> _groups; 
    public ObservableCollection<Group> Groups 
    { 
     get { return _groups; } 
    } 

    public Window2() 
    { 
     InitializeComponent(); 

     InitGroups(); 

     treeView.ItemsSource = _groups; 
     treeView1.ItemsSource = _groups; 
    } 

    private void InitGroups() 
    { 
     _groups = new ObservableCollection<Group>(); 

     Group group1 = new Group("Group1"); 
     group1.Groups.Add(new Group("Group1.1")); 
     group1.Groups.Add(new Group("Group1.2")); 
     group1.Groups.Add(new Group("Group1.3")); 

     group1.Items.Add(new Item("Item1.1")); 
     group1.Items.Add(new Item("Item1.2")); 

     group1.Groups[1].Items.Add(new Item("Item1.2.1")); 
     group1.Groups[1].Items.Add(new Item("Item1.2.2")); 


     _groups.Add(group1); 

     Group group2 = new Group("Group2"); 
     group2.Groups.Add(new Group("Group2.1")); 
     group2.Groups.Add(new Group("Group2.2")); 

     group2.Items.Add(new Item("Item2.1")); 
     group2.Groups[0].Items.Add(new Item("Item2.1.1")); 
     group2.Groups[0].Items.Add(new Item("Item2.1.1")); 

     _groups.Add(group2); 
    } 
} 
} 

結果 Result

今私はTreeView.HeaderTemplateSelectorを使用すると思いますが、唯一のXAMLを使用する方法が存在するかもしれません。

ありがとうございました。

+0

私はあなたが右側にあると考えていますテンプレートセレクタを使用して私はまた、このタイプのものに対するxamlの解決策があることを願っています。私はセレクタで任意のコードを実行する能力はxamlで行うには複雑すぎると思います。私は[this](http://zhebrun.blogspot.com/2008/09/are-you-tired-to-create.html)のようないくつかのソリューションを見てきましたが、それらを試していません。 –

+0

@ Victor Chekalin - あなたはこれまでの解決策を見つけましたか?それは素晴らしい質問です。私は同じ問題を抱えています。 – Rachael

答えて

4

希望する結果を達成するには、いくつかの方法があります。あなたはDataTemplateのみTreeViewItemオブジェクトに使用されることを確信している場合は、最も簡単にはTreeViewItem.IsSelectedプロパティに直接結合して、あなたのDataTemplateの変化に反応するだけです:

<DataTemplate DataType="{x:Type WpfApplication1:Item}"> 
     <TextBlock Text="{Binding ItemName}"> 
      <TextBlock.Style> 
       <Style> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding IsSelected, RelativeSource= 
{RelativeSource FindAncestor, AncestorType={x:Type TreeViewItem}}, FallbackValue=False}" 
Value="True"> 
          <Setter Property="TextBlock.FontStyle" Value="Italic" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </TextBlock.Style> 
     </TextBlock> 
    </DataTemplate> 
関連する問題