2009-04-05 18 views
5

Para almacenar un objeto (por ejemplo, una instancia de una clase) en un TreeViewItem, actualmente estoy almacenando el objeto en el TreeViewItem 's Header y luego reemplazando el método de esa clase ToString , para que muestre el encabezado de cadena correcto; Luego lanzo el objeto hacia atrás durante un evento.WPF: almacenar correctamente un objeto en un TreeViewItem


¿Es esta la manera correcta de lograr este tipo de cosas, o hay alguna forma mejor y más adecuada?

Respuesta

7

La forma "correcta" es simplemente agregar el object a los TreeView 's (o TreeViewItem' s) Items recogida y utilizar un HierarchicalDataTemplate para controlar cómo se procesa el material:

Person.cs:

public class Person 
{ 
    private readonly ICollection<Person> _children = new ObservableCollection<Person>(); 

    public string Name { get; set; } 

    public ICollection<Person> Children 
    { 
     get 
     { 
      return _children; 
     } 
    } 
} 

Window1.xaml.cs:

public Window1() 
{ 
    InitializeComponent(); 

    var people = new List<Person>(); 
    var kent = new Person() { Name = "Kent" }; 
    kent.Children.Add(new Person() { Name = "Tempany" }); 
    people.Add(kent); 
    _treeView.ItemsSource = people; 
} 

Window1.xaml:

<TreeView x:Name="_treeView"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate DataType="{x:Type local:Person}" ItemsSource="{Binding Children}"> 
      <TextBlock Text="{Binding Name}"/> 
     </HierarchicalDataTemplate> 
    </TreeView.Resources> 
</TreeView> 
+0

Gracias por la respuesta. ¿Cómo implementar una "HierarchicalDataTemplate anidada" por así decirlo? Por ejemplo, los elementos en el enlace ItemsSource tienen otra lista dentro de ellos, y quiero que la lista sea una sublista de ellos. –

+0

np Dreas. ¿Puedes marcar como respuesta y hacer una pregunta separada sobre las HierarchicalDataTemplates anidadas? –

+0

Hola Kent, haré. –

1

La "respuesta" por encima de mi punto de vista no responde a la pregunta real, y de hecho la pregunta original indica que la cuestión autor ya tenía una solución muy eficiente para la problema. Sin embargo, la "respuesta" proporcionada simplemente muestra cómo adjuntar un subobjeto a un TreeViewItem y cómo posteriormente procesarlo utilizando un método personalizado. Si bien esto es útil, esta respuesta no aborda la naturaleza real de la pregunta original.

Existen muchos escenarios en los que TreeViewItem necesita tener un objeto externo adjunto que no pertenece a la lista Elementos del elemento de TreeView. Esto facilita el acceso al objeto externo adjunto para fines específicos de la aplicación cuando el usuario selecciona TreeViewItem de TreeView. Este concepto es completamente diferente de la idea de agregar subobjetos a un TreeViewItem.

Un método alternativo para resolver este problema, a diferencia de la solución implementada originalmente por el autor de la pregunta, es crear una subclase de la clase TreeViewItem y agregar información personalizada, como un objeto adjunto. Este principio se ilustra en el artículo http://msdn.microsoft.com/en-us/library/1330h6a4.aspx. Después de implementar esta subclase personalizada TreeViewItem, esta subclase se puede agregar a la lista de elementos de TreeView o TreeViewItem. Cuando el usuario selecciona el elemento de TreeView, el objeto devuelto de la selección será la subclase personalizada, que contendrá la información personalizada que la subclase haya definido.

Una ventaja adicional de usar una subclase TreeViewItem personalizada en lugar de TreeViewItem es que la subclase puede implementar comportamientos personalizados. Por ejemplo, para mostrar una información sobre herramientas personalizada cuando el usuario pasa el ratón sobre el tema, la subclase puede configurar un objeto de información sobre herramientas por sí mismo con un código como:

ToolTip tip = new ToolTip() { Content = "Tooltip display value" }; 
ToolTipService.SetToolTip(this, tip); 
Cuestiones relacionadas