2009-11-11 19 views
15

Po prostu próbuję znaleźć sposób kontrolowania rozwinięcia/zwinięcia węzłów TreeView poprzez obiekt, do którego są przypisani. Obiekt ma właściwość IsExpanded i chcę go użyć, aby rozwinąć lub zwinąć węzeł TreeView na podstawie tej właściwości.Podgląd drzewa danych WPF DataBound expand/collapse

Oto mój kod:

C#:

public partial class Window2 : Window 
{ 
    public Window2() 
    { 
     InitializeComponent(); 

     this.DataContext = new List<Parent>() { Base.GetParent("Parent 1"), Base.GetParent("Parent 2") }; 
    } 
} 

public class Base 
{ 
    public string Name { get; set; } 
    public bool IsExpanded { get; set; } 

    public static Parent GetParent(string name) 
    { 
     Parent p = new Parent() { Name = name }; 

     p.Children.Add(new Child() { Name = "Child 1", GrandChildren = new ObservableCollection<GrandChild>() { new GrandChild() { Name = "Grandchild 1" } } }); 
     p.Children.Add(new Child() { Name = "Child 2", GrandChildren = new ObservableCollection<GrandChild>() { new GrandChild() { Name = "Grandchild 1" } } }); 
     p.Children.Add(new Child() { Name = "Child 3", GrandChildren = new ObservableCollection<GrandChild>() { new GrandChild() { Name = "Grandchild 1" } } }); 

     return p; 
    } 
} 

public class Parent : Base 
{ 
    public ObservableCollection<Child> Children { get; set; } 

    public Parent() 
    { 
     this.Children = new ObservableCollection<Child>(); 
    } 
} 

public class Child : Base 
{ 
    public ObservableCollection<GrandChild> GrandChildren { get; set; } 

    public Child() 
    { 
     this.GrandChildren = new ObservableCollection<GrandChild>(); 
    } 
} 

public class GrandChild : Base 
{ 
} 

XAML:

<Window x:Class="HeterogeneousExperimentExplorer.Window2" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:HeterogeneousTree" 
    Title="Window2" Height="300" Width="300"> 
    <Window.Resources> 
     <HierarchicalDataTemplate DataType="{x:Type local:Parent}" ItemsSource="{Binding Children}"> 
      <TextBlock Text="{Binding Name}" /> 
      <HierarchicalDataTemplate.ItemTemplate> 
       <HierarchicalDataTemplate DataType="{x:Type local:Parent}" ItemsSource="{Binding GrandChildren}"> 
        <TextBlock Text="{Binding Name}" /> 
        <HierarchicalDataTemplate.ItemTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding Name}" /> 
         </DataTemplate> 
        </HierarchicalDataTemplate.ItemTemplate> 
       </HierarchicalDataTemplate> 
      </HierarchicalDataTemplate.ItemTemplate> 
     </HierarchicalDataTemplate> 
    </Window.Resources> 
    <Grid> 
     <TreeView ItemsSource="{Binding}" /> 
    </Grid> 
</Window> 

Odpowiedz

40

Came się z roztworu. Naprawdę prosta:

<Style TargetType="{x:Type TreeViewItem}"> 
     <Setter Property="IsExpanded" Value="{Binding IsNodeExpanded}"> 
     </Setter> 
    </Style> 

Więc styl pobiera obiekt związany z TreeViewItem i patrzy na jego IsNodeExpanded atrybutu i przypisuje tę wartość do właściwości TreeViewItem.IsExpanded. Jeśli dodasz Mode = TwoWay, powiadomią się nawzajem (TreeViewItem powie obiektowi, kiedy został rozszerzony).

Dzięki!

1

FWIW, może Cię zainteresować ten CodeProject article by Josh Smith, który pokazuje, jak utworzyć widok drzewa na podstawie MVVM przy użyciu podejścia ogólnego (na poziomie n).

Nie sugeruję, że coś jest nie tak z implementacją Carla, ale uznałem, że artykuł ten jest pomocny w zrozumieniu kontroli TreeView i ogólnie MVVM.

Powiązane problemy