Silverlight Toolkit Treeview: Obtenir le parent d'un élément sélectionné
-
09-09-2019 - |
Question
J'utilise le composant TreeView de la boîte à outils Silverlight et je suis en train de faire le parent d'un nœud sélectionné. Le TreeView est lié à une série d'objets, afin de travailler directement avec un TreeViewItem semble être hors de question.
<toolkit:TreeView SelectedItemChanged="DoStuff" DisplayMemberPath="Name" ItemsSource="{Binding MyCollection}">
<toolkit:TreeView.ItemTemplate>
<common:HierarchicalDataTemplate ItemsSource="{Binding MySubCollection}">
<StackPanel>
<TextBlock Text="{Binding Name}" />
</StackPanel>
</common:HierarchicalDataTemplate>
</toolkit:TreeView.ItemTemplate>
</toolkit:TreeView>
Y at-il un moyen de récupérer le parent d'un élément sélectionné dans l'événement DoStuff?
La solution
Tant que vous avez téléchargé la dernière Silverlight Toolkit alors c'est facile à l'aide des TreeViewExtensions qui sont inclus.
- Télécharger le Silverlight Toolkit et installer.
- Ajoutez une référence à System.Windows.Controls.Toolkit (de la boîte à outils Silverlight)
-
Utilisez la méthode d'extension getParentItem (), comme suit:
private void DoStuff(object sender, RoutedPropertyChangedEventArgs<object> e) { if (e.NewValue != null) { var parent = ((TreeView)sender).GetParentItem(e.NewValue); // // Do stuff with parent, this snippet updates // a TextBlock showing the name of the current parent if (parent != null) { Status.Text = parent.ToString(); } } }
Autres conseils
Pourquoi ne pas vous avez juste les objets MySubcollection conserver une référence à leurs parents?
Supposons que le nom de votre arbre est « arbre », cela devrait faire l'affaire
((tree.SelectedItem as TreeViewItem).Parent as SomeObjectOfYours)
Justin Ange a écrit sur TreeView « avancé » utilise, entre les éléments de trouver arbirtraty dans un TreeView par leur objet lié. Depuis que je suis relativement nouveau à Silverlight, je ne sais pas s'il y a une meilleure façon plus élégante, mais vous pouvez utiliser l'une de ses méthodes pour trouver le parent.
J'imagine un appel à l'aide de cette façon:
TreeViewItem trvi = ContainerFromItem(tree, tree.SelectedItem);
MySubCollectionItem parentItem = ItemFromContainer(tree, trvi.Parent); // note the "Parent" here
Avec les méthodes d'extension disponibles ci-dessous à partir de quelque part:
public static TreeViewItem ContainerFromItem(this TreeView treeView, object item)
{
TreeViewItem containerThatMightContainItem = (TreeViewItem)treeView.ItemContainerGenerator.ContainerFromItem(item);
if (containerThatMightContainItem != null)
return containerThatMightContainItem;
else
return ContainerFromItem(treeView.ItemContainerGenerator, treeView.Items, item);
}
private static TreeViewItem ContainerFromItem(ItemContainerGenerator parentItemContainerGenerator, ItemCollection itemCollection, object item)
{
foreach (object curChildItem in itemCollection)
{
TreeViewItem parentContainer = (TreeViewItem)parentItemContainerGenerator.ContainerFromItem(curChildItem);
if (parentContainer == null)
return null;
TreeViewItem containerThatMightContainItem = (TreeViewItem)parentContainer.ItemContainerGenerator.ContainerFromItem(item);
if (containerThatMightContainItem != null)
return containerThatMightContainItem;
TreeViewItem recursionResult = ContainerFromItem(parentContainer.ItemContainerGenerator, parentContainer.Items, item);
if (recursionResult != null)
return recursionResult;
}
return null;
}
public static object ItemFromContainer(this TreeView treeView, TreeViewItem container)
{
TreeViewItem itemThatMightBelongToContainer = (TreeViewItem)treeView.ItemContainerGenerator.ItemFromContainer(container);
if (itemThatMightBelongToContainer != null)
return itemThatMightBelongToContainer;
else
return ItemFromContainer(treeView.ItemContainerGenerator, treeView.Items, container);
}
private static object ItemFromContainer(ItemContainerGenerator parentItemContainerGenerator, ItemCollection itemCollection, TreeViewItem container)
{
foreach (object curChildItem in itemCollection)
{
TreeViewItem parentContainer = (TreeViewItem)parentItemContainerGenerator.ContainerFromItem(curChildItem);
if (parentContainer == null)
return null;
TreeViewItem itemThatMightBelongToContainer = (TreeViewItem)parentContainer.ItemContainerGenerator.ItemFromContainer(container);
if (itemThatMightBelongToContainer != null)
return itemThatMightBelongToContainer;
TreeViewItem recursionResult = ItemFromContainer(parentContainer.ItemContainerGenerator, parentContainer.Items, container) as TreeViewItem;
if (recursionResult != null)
return recursionResult;
}
return null;
}