Pour enregistrer un objet (par exemple, une instance d'une classe) dans un TreeViewItem, je stocke actuellement l'objet dans le Header
de TreeViewItem
puis redéfinissant la méthode ToString
de cette classe , de sorte qu'il affiche l'en-tête de chaîne correcte; Je rejette ensuite l'objet lors d'un événement. Est-ce la bonne façon de réaliser ce genre de chose, ou y a-t-il un moyen plus approprié?WPF: Correctement le stockage d'un objet dans un TreeViewItem
Répondre
La façon "correcte" est d'ajouter juste le object
aux TreeView
'(s ou TreeViewItem
) s' Items
collection et utiliser un HierarchicalDataTemplate
pour contrôler la façon dont l'élément est rendu:
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>
La « réponse » ci-dessus à mon avis ne répond pas à la question réelle, et en fait la question initiale indique que l'auteur de la question avait déjà une solution très efficace pour la problème. Cependant, la "réponse" fournie montre simplement comment attacher un sous-objet à un TreeViewItem et comment le rendre ensuite en utilisant une méthode personnalisée. Bien que cela soit utile, cette réponse n'aborde pas la nature réelle de la question initiale.
Il existe de nombreux scénarios dans lesquels TreeViewItem doit être associé à un objet externe qui n'appartient pas à la liste Items de TreeViewItem. Cela facilite l'accès à l'objet externe attaché à des fins spécifiques à l'application lorsque l'utilisateur sélectionne TreeViewItem à partir de TreeView. Ce concept est entièrement différent de l'idée d'ajouter des sous-objets à un TreeViewItem.
Une autre méthode de résolution de ce problème, par opposition à la solution initialement mise en œuvre par l'auteur de la question, consiste à sous-classer la classe TreeViewItem et à ajouter des informations personnalisées, telles qu'un objet joint. Ce principe est illustré dans l'article http://msdn.microsoft.com/en-us/library/1330h6a4.aspx. Après l'implémentation de cette sous-classe TreeViewItem personnalisée, cette sous-classe peut être ajoutée à la liste Items d'un TreeView ou d'un TreeViewItem. Lorsque l'utilisateur sélectionne l'élément dans TreeView, l'objet renvoyé à partir de la sélection sera la sous-classe personnalisée, qui contiendra toutes les informations personnalisées définies par la sous-classe.
Un avantage supplémentaire de l'utilisation d'une sous-classe TreeViewItem personnalisée au lieu d'un TreeViewItem est que les comportements personnalisés peuvent être implémentés par la sous-classe. Par exemple, pour afficher une info-bulle personnalisé lorsque l'utilisateur passe la souris sur l'élément, la sous-classe peut définir un objet infobulle pour lui-même avec le code comme:
ToolTip tip = new ToolTip() { Content = "Tooltip display value" };
ToolTipService.SetToolTip(this, tip);
- 1. WPF: Combobox dans TreeviewItem
- 2. Sélection de Treeviewitem dans WPF
- 3. comment sélectionner treeviewitem en wpf
- 4. WPF: Liaison à TreeViewItem sélectionné
- 5. Comment lier correctement un ListBoxItem dans WPF?
- 6. WPF - Commande dans un objet MenuItem dans un DataTemplate
- 7. Stockage d'un objet SqlDataReader dans C#/ASP.NET?
- 8. stockage fonctions python non liées dans un objet de classe
- 9. Menu contextuel sur TreeViewItem Appelle la méthode TreeViewItem?
- 10. sérialisation d'un objet et le stockage à un champ varbinary dans un DB
- 11. Comment puis-je remplacer TreeViewItem dans WPF pour permettre le chargement des enfants asynchrones?
- 12. Comment déterminez-vous la largeur du texte dans un TreeViewItem WPF au moment de l'exécution?
- 13. Comment obtenir un objet supérieur (fenêtre ou page) dans WPF?
- 14. objet modifié après l'état de l'objet ou le stockage utilisé
- 15. Dans WPF, lorsque je sélectionne un TreeViewItem, comment puis-je me concentrer sur un autre contrôle tout en complétant ma sélection TreeViewItem?
- 16. Appliquer le style à tous TreeViewItem
- 17. Comment pouvez-vous cloner un objet WPF?
- 18. Le stockage d'état dans GridView
- 19. Comment puis-je sélectionner TreeViewItem suivant/précédent dans un TreeView?
- 20. C# WPF Comment puis-je obtenir un TreeViewItem à partir de l'élément HierarchicalDataTemplate?
- 21. Sélection d'un objet sur un canevas WPF?
- 22. Puis-je envelopper automatiquement les éléments HierarchicalDataTemplate dans un TreeViewItem?
- 23. Comment définir le focus sur un contrôle dans un TreeViewItem lorsqu'il est sélectionné
- 24. Pourquoi WPF n'affiche-t-il pas correctement un caractère accentué?
- 25. Force un contrôle WPF personnalisé pour redimensionner correctement
- 26. Changement TreeViewItem tête par déclencheur
- 27. Stockage de MemoryStream dans le cache
- 28. Rechercher TreeViewItem pour supprimer des données
- 29. chute de glisser dans WPF
- 30. Rechercher le contrôle Silverlight TreeViewItem par l'en-tête
Merci pour la réponse. Comment mettre en œuvre un "HierarchicalDataTemplate imbriqué" pour ainsi dire? Par exemple, les éléments de la liaison ItemsSource ont une autre liste à l'intérieur d'eux, et je veux que la liste soit une sous-liste de ceux-ci. –
np Dreas. Pouvez-vous marquer comme réponse et poser une question distincte sur les HierarchicalDataTemplates imbriqués? –
Salut Kent, fera l'affaire. –