2009-11-11 16 views
15

Estoy tratando de encontrar una forma de controlar la expansión/colapso de los nodos TreeView a través del objeto al que están vinculados. El objeto tiene una propiedad IsExpanded, y quiero usar eso para mostrar el nodo TreeView expandido o contraído en función de esa propiedad.WPF DataBound treeview expand/collapse

Aquí está mi código:

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> 

Respuesta

40

se le ocurrió la solución. Muy simple:

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

así que el estilo obtiene el objeto unido a la TreeViewItem y mira a su atributo IsNodeExpanded y se asigna ese valor a la propiedad TreeViewItem.IsExpanded. Si agrega Mode = TwoWay, se notificarán entre sí (TreeViewItem le dirá al objeto cuando se haya expandido).

Gracias!

1

FWIW, puede estar interesado en este CodeProject article by Josh Smith que muestra cómo crear una vista en árbol basada en MVVM utilizando un enfoque genérico (n-level).

No sugiero que haya algún problema con la implementación de Carlo, pero encontré ese artículo útil para comprender el control TreeView y MVVM en general.