Pergunta

Eu estou usando o componente TreeView a partir do kit de ferramentas Silverlight e eu estou tentando obter o pai de um nó selecionado. O TreeView está ligado a uma série de objetos, trabalhando tão diretamente com um TreeViewItem parece estar fora de questão.

<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>

Existe uma maneira para buscar o pai de um item selecionado em caso DoStuff?

Foi útil?

Solução

Enquanto você tiver baixado a última Silverlight Toolkit, então isso é fácil usando as TreeViewExtensions que estão incluídos.

  1. Faça o download do Silverlight Toolkit e instalar.
  2. Adicione uma referência para System.Windows.Controls.Toolkit (a partir do Silverlight Toolkit)
  3. Use o GetParentItem () método de extensão, assim:

    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();
            }
        }
    }
    

Outras dicas

Por que você não só tem os objetos em MySubcollection manter uma referência ao seu pai?

Suponha que o nome de sua árvore é "árvore", este deve fazer o truque

((tree.SelectedItem as TreeViewItem).Parent as SomeObjectOfYours)

Justin anjo escreveu sobre "avançados" usos TreeView, entre eles encontrar elementos arbirtraty em um treeview pelo seu objecto dependente. Desde que eu sou relativamente novo para o Silverlight, eu não tenho certeza se há uma melhor, maneira mais elegante, mas você pode usar um de seus métodos para encontrar o pai.

Eu imagino usando uma chamada desta forma:

TreeViewItem trvi = ContainerFromItem(tree, tree.SelectedItem);
MySubCollectionItem parentItem = ItemFromContainer(tree, trvi.Parent); // note the "Parent" here

Com os métodos de extensão abaixo disponíveis de algum lugar:

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top