Question

J'utilise un ListView pour afficher les éléments dans une liste. L'utilisateur peut sélectionner les éléments lui-même, ou utiliser pour sélectionner des éléments avec des attributs spécifiques des "touches de présélection de.

Pour vérifier les éléments que j'utilise quelque chose comme ça:

for(int i;i<MyListView.Items.Count;++i)
{
    if( /*... Check if the items should be selected ...*/ )
        (MyListView.ItemContainerGenerator.ContainerFromIndex(i) as ListViewItem).IsSelected = true;
}

Cela fonctionne parfaitement pour les articles, qui sont visibles au moment de excecution. Mais pour les articles, qui ne sont pas visibles, ContainerFromIndex () retourne null. J'ai entendu cela a quelque chose à voir avec la virtualisation, et que la liste ne connaît pas les articles à l'envers ou à la baisse le « champ de vision ». Mais comment se fait qu'il est possible d'avoir des éléments sélectionnés dans la liste des hors-jeu le « champ de vision » lorsque vous les sélectionnez manuellement?

Et comment faire une sélection d'un élément extérieur "champ de vision? Je pense qu'il doit être possible.

Merci pour toute aide, Marques

Était-ce utile?

La solution

Comme vous l'avez mentionné, je suppose que le problème est la virtualisation des postes de ListView. Par défaut, ListView (et ListBox) utiliser VirtualizingStackPanel comme ItemsPanel pour améliorer les performances. Une brève explication de la façon dont cela fonctionne peut être lu ici .

Vous pouvez remplacer par un autre groupe, cependant. Dans ce cas, essayez d'utiliser un StackPanel normal. Si vous avez une tonne d'articles dans la ListView, surtout si elles sont des éléments complexes, les performances peuvent souffrir un peu.

<ListView>
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel/>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
</ListView>

Modifier

Vous pouvez également essayer de solution décrite à ce question similaire, en fonction de votre modèle. Toutefois, cela ne fonctionnera probablement pas pour vous.

Autres conseils

Lorsque vous traitez avec des contrôles des articles virtualisent, une alternative à la désactivation de la virtualisation (qui est en fait une caractéristique utile parfois, même si elle interfère avec le fonctionnement correct des autres parties de l'API), est de trouver le VirtualizingPanel et lui dire explicitement pour faire défiler.

Par exemple:

void ScrollToIndex(ListBox listBox, int index)
{
    VirtualizingPanel panel = FindVisualChild<VirtualizingPanel>(listBox);

    panel.BringIndexIntoViewPublic(index);
}

static T FindVisualChild<T>(DependencyObject o) where T : class
{
    T result = o as T;

    if (result != null)
    {
        return result;
    }

    int childCount = VisualTreeHelper.GetChildrenCount(o);

    for (int i = 0; i < childCount; i++)
    {
        result = FindVisualChild<T>(VisualTreeHelper.GetChild(o, i));

        if (result != null)
        {
            return result;
        }
    }

    return null;
}

Je ne suis pas très satisfait de la nécessité de chercher dans l'arbre visuel pour trouver le panneau, mais je ne suis pas au courant d'aucune autre façon de le faire, ni à défiler à un index spécifique lorsqu'il s'agit d'un panneau de Virtualisation .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top