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?

Était-ce utile?

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.

  1. Télécharger le Silverlight Toolkit et installer.
  2. Ajoutez une référence à System.Windows.Controls.Toolkit (de la boîte à outils Silverlight)
  3. 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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top