Silverlight Toolkit Treeview: Ottenere il genitore di un elemento selezionato
-
09-09-2019 - |
Domanda
Sto utilizzando il componente TreeView dal toolkit Silverlight e sto cercando di ottenere il padre di un nodo selezionato. La TreeView è associato a una serie di oggetti, lavorare così direttamente con un TreeViewItem sembra essere fuori discussione.
<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>
C'è un modo per andare a prendere il genitore di un elemento selezionato in caso DoStuff?
Soluzione
Finché hai scaricato l'ultima Toolkit Silverlight allora questo è facile utilizzando i TreeViewExtensions che sono inclusi.
- Silverlight Toolkit e installare.
- Aggiungere un riferimento alla System.Windows.Controls.Toolkit (dal Silverlight Toolkit)
-
Utilizzare il metodo di estensione GetParentItem (), in questo modo:
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(); } } }
Altri suggerimenti
Perché non resta che gli oggetti in MySubcollection mantenere un riferimento al loro genitore?
Si supponga che il nome del vostro albero è "struttura", questo dovrebbe fare il trucco
((tree.SelectedItem as TreeViewItem).Parent as SomeObjectOfYours)
Justin Angelo ha scritto su "avanzate" TreeView utilizza, tra i quali trovare elementi arbirtraty in una vista ad albero dal loro oggetto associato. Dato che io sono relativamente nuovo a Silverlight, non sono sicuro se c'è un modo migliore e più elegante, ma si potrebbe usare uno dei suoi metodi per trovare il genitore.
Immagino utilizzando una chiamata in questo modo:
TreeViewItem trvi = ContainerFromItem(tree, tree.SelectedItem);
MySubCollectionItem parentItem = ItemFromContainer(tree, trvi.Parent); // note the "Parent" here
Con i metodi di estensione sotto disponibili da qualche parte:
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;
}