2012-02-03 114 views
4

在我的TreeView中,我使用兩個不同的類來進行綁定。例如,我有一個Group可以擁有ChildGroup並且可以有Items。這個類的 示例代碼:當IsSelected更改TreeViewItem模板和TreeView中使用兩種類型

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

將其綁定到樹視圖我用下面的模板

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

這是很容易。

問題是我選擇時需要更改ItemTemplate。而且我只需要改變選擇的Item類。

我可以做到這一點,如果只有一個類用於綁定。它也很容易使用樣式和觸發器,如下所示:

<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),但還沒有嘗試過。 – 2012-02-03 05:35:10

+0

@Victor Chekalin - 你曾經找到過解決方案嗎?這是一個很好的問題,我陷入了同樣的問題。 – Rachael 2013-03-12 00:51:56

回答

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>