Pregunta

Tengo botones Primero / Último / Anterior / Siguiente que cambian el nodo secundario seleccionado de un TreeViewItem. Establecer el primer y el último nodo como seleccionados no es un problema. Por ejemplo, para seleccionar el último nodo secundario:

TreeViewItem selectedItem = (myTreeView.SelectedItem as TreeViewItem);
TreeViewItem ParentItem = (selectedItem.Parent as TreeViewItem);
(ParentItem.Items[ParentItem.Items.Count - 1] as TreeViewItem).IsSelected = true;

¿Cuál sería la forma más fácil / elegante de configurar el elemento Anterior / Siguiente como seleccionado?

¡Gracias!

¿Fue útil?

Solución

Puede reemplazar el bucle for con una llamada IndexOf.

int index = ParentItem.Items.IndexOf(MyTreeView.SelectedItem)

Y, por supuesto, será bueno verificar si index + 1 es un índice de colección válido.

Y para el hermano anterior será index - 1.

Otros consejos

Mi variante funciona para mí al menos para un árbol de 4 niveles.

Si el cursor se encuentra con el último elemento de vista de árbol, se iniciará. Si presiona Anterior en el primer nodo, permanece en su lugar.

        // Button Back
    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        if (treeViewStruct.Items.Count < 1) return;
        if (Currentitem == null)
        {
            ((TreeViewItem)treeViewStruct.Items[0]).IsSelected = true;
            return;
        }
        TreeViewItem item = FindPreviousItem(Currentitem);
        if (item == null)
            ((TreeViewItem)treeViewStruct.Items[0]).IsSelected = true;
        else item.IsSelected = true;
    }

    /// <summary>
    /// Get Previous Node
    /// </summary>
    /// <param name="item">Current selected node</param>
    /// <returns></returns>
    private static TreeViewItem FindPreviousItem(TreeViewItem item)
    {
        TreeViewItem foundedItem = null;
        var parentItem = (item.Parent as TreeViewItem);
        if (parentItem != null)
        {
            int index = parentItem.Items.IndexOf(item);
            if (index > 0 && index < parentItem.Items.Count)
            {
                return FindLastChildren((TreeViewItem)parentItem.Items[index - 1]);
            }
            else if (index == 0)
                return parentItem;
        }
        else return item;
        return foundedItem;
    }



    private static TreeViewItem FindLastChildren(TreeViewItem parent)
    {
        if (parent.Items.Count > 0)
        {
            return FindLastChildren((TreeViewItem)parent.Items.Last());
        }
        else return parent;
    }

    // вперед
    private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        if (treeViewStruct.Items.Count < 1) return;
        if (Currentitem == null)
        {
            ((TreeViewItem)treeViewStruct.Items[0]).IsSelected = true;
            return;
        }
        TreeViewItem item = FindNextItem(Currentitem);
        if (item == null)
            ((TreeViewItem)treeViewStruct.Items[0]).IsSelected = true;
        else item.IsSelected = true;
    }


    /// <summary>
    /// Get Next Node
    /// </summary>
    /// <param name="item">Current selected node</param>
    /// <returns></returns>
    private static TreeViewItem FindNextItem(TreeViewItem item)
    {
        TreeViewItem foundedItem = null;
        if (item.Items.Count < 1)
        {
            var parentItem = (item.Parent as TreeViewItem);
            if (parentItem != null)
            {
                int index = parentItem.Items.IndexOf(item);
                if (index > 0 && index < parentItem.Items.Count - 1)
                {
                    return (TreeViewItem)parentItem.Items[index + 1];
                }
                else if (index == parentItem.Items.Count - 1)
                {
                    return FindFirstNextParent(parentItem);
                }
            }
            else return item;
        }
        return (TreeViewItem)item.Items[0];
    }

    private static TreeViewItem FindFirstNextParent(TreeViewItem parent)
    {
        var parentParent = ((TreeViewItem)parent).Parent;
        if (parentParent is TreeViewItem)
        {
            int pindex = ((TreeViewItem)parentParent).Items.IndexOf(parent);
            if ((pindex + 1) < ((TreeViewItem)parentParent).Items.Count)
                return ((TreeViewItem)((TreeViewItem)parentParent).Items[pindex + 1]);
            else
            {
                return FindFirstNextParent(((TreeViewItem)((TreeViewItem)parent).Parent));
            }
        }
        return parent;
    }

No es elegante, pero funciona. ¿Alguien puede encontrar una solución mejor? (" Siguiente " funcionalidad mostrada)

int index = 0;
foreach (TreeViewItem i in ParentItem.Items) {
    if (i.Equals(MyTreeView.SelectedItem)) {
        break;
    }
    index++;
}
(ParentItem.Items[index + 1] as TreeViewItem).IsSelected = true;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top