2010-01-30 19 views
15

Digamos que tengo un árbol binario, donde la raíz de la estructura de datos es solo un nodo de árbol. Para cada nodo, se puede acceder a los niños a través de la propiedad Children. Esto es lo que intenté. El TreeRoot es una propiedad del contexto de datos heredado, pero es un nodo único (no una colección).¿Puedo vincular una WPF TreeView a un único nodo raíz?

<UserControl.Resources> 
    <HierarchicalDataTemplate x:Key="TreeNodeTemplate" ItemsSource="{Binding Children}"> 
     <TextBlock Text="{Binding Name}" /> 
    </HierarchicalDataTemplate> 
</UserControl.Resources> 

<Grid> 
    <TreeView ItemsSource="{Binding TreeRoot}" ItemTemplate="{StaticResource TreeNodeTemplate}" /> 
</Grid> 
+0

¿Alguna de las siguientes respuestas resuelve su problema, Sam? De ser así, ¿podría aceptar la respuesta que mejor resolvió su problema? Si no, ¿podría proporcionar más información sobre lo que falta? ¡Gracias! –

Respuesta

4

Creo que su problema es que su modelo de datos jerárquico solamente se aplica al nodo raíz, por lo que nunca se ve nada más allá hijos de la raíz. Tal vez puedas probar:

<UserControl.Resources> 
    <HierarchicalDataTemplate DataType="{x:Type TreeNode}" ItemsSource="{Binding Children}"> 
     <TextBlock Text="{Binding Name}" /> 
    </HierarchicalDataTemplate> 
</UserControl.Resources> 

<Grid> 
    <TreeView ItemsSource="{Binding TreeRoot}"/> 
</Grid> 

Dónde TreeNode es el nombre de la clase de nodo de árbol.

2

Como dijo Aviad, si usa DataType="{x:Type TreeNode}" entonces TreeView utilizará automáticamente esa plantilla para cualquier objeto de ese tipo.

Si tiene varios tipos en su jerarquía, puede especificar múltiples HierarchicalDataTemplates cada uno con el tipo de datos para el que está. Eso permitiría que TreeView maneje cada tipo de manera diferente.

<HierarchicalDataTemplate DataType="{x:Type TreeNode}" ItemsSource="{Binding Children}"> 
    <TextBlock Text="{Binding Name}" /> 
</HierarchicalDataTemplate> 

<HierarchicalDataTemplate DataType="{x:Type TreeLeaf}"> 
    <TextBlock Text="{Binding Message}" Background="Red" /> 
</HierarchicalDataTemplate> 
9

he tenido este problema y llegó a la conclusión de que no podía obligar a una falta de cobro a una vista de árbol como una forma de especificar el nodo raíz. Entonces, lo que hice fue hacer un cambio rápido en mi ModelView y convertir la propiedad que representa el nodo raíz en una colección de 1 artículo.

public class ContainerViewModel 
{ 
    public ObservableCollection<TreeNodeViewModel> RootNodes { get; private set; } 

    public ContainerViewModel() 
    { 
     // Create a single node in the collection of root nodes 
     RootNodes = new ObservableCollection<TreeNodeViewModel>(); 
     RootNodes.Add(new TreeNodeViewModel()); 
    } 
} 

public class TreeNodeViewModel 
{ 
    public ObservableCollection<TreeNodeViewModel> Children { get; set; } 
} 

He utilizado un ObservableCollection <> anteriormente, pero podría tener más sentido usar algo más barato como una lista <> ya que no espera que la colección para cambiar (al menos en su escenario).

Cuestiones relacionadas