Frage

Ich bin mit einem Listview-Elementen in einer Liste zu zeigen. Der Benutzer kann die Elemente selbst auswählen oder einige ‚Vorwahltasten‘ verwenden, um Elemente mit bestimmten Eigenschaften zu wählen.

Um die Elemente zu überprüfen Ich verwende etwas wie folgt aus:

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

Das funktioniert perfekt für die Einzelteile, die zum Zeitpunkt der Excecution sichtbar sind. Aber für die Einzelteile, die nicht sichtbar sind, ContainerFromIndex () gibt den Wert null. Ich habe gehört, das etwas mit Virtualisierung zu tun hat, und dass die Liste nicht über Elemente nicht kennt den Kopf oder das ‚Sichtfeld‘ Nachteil. Aber wie kommt, dass es möglich ist, in der Liste ausgewählte Elemente zu haben, abseits dem ‚Sichtfeld‘, wenn Sie sie manuell auswählen?

Und wie ein Auswahl eines Elements außerhalb ‚Sichtfeld‘ zu tun? Ich denke, dass muss möglich sein.

Vielen Dank für jede Hilfe, Marks

War es hilfreich?

Lösung

Wie Sie erwähnt haben, meine Vermutung ist, dass das Problem Virtualisierung der Listview-Elemente ist. Standardmäßig Listview (und List-Box) Verwendung VirtualizingStackPanel als Itemspanel, um die Leistung zu verbessern. Eine kurze Erklärung dafür, wie es funktioniert, kann hier .

Sie können ein anderes Panel ersetzen, jedoch. In diesem Fall versuchen, ein normales Stackpanel verwenden. Wenn Sie eine Tonne Elemente im Listview, vor allem, wenn sie komplexe Elemente, die Leistung könnte ein wenig leiden.

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

Bearbeiten

Sie können auch auf Lösung versuchen können, beschrieben an dieser ähnliche Frage , je nach Modell. Allerdings ist dies wahrscheinlich nicht für Sie arbeiten.

Andere Tipps

Wenn Sie mit virtualisieren Artikeln Kontrollen zu tun, eine Alternative zur Deaktivierung der Virtualisierung (die in der Tat ist eine nützliche Funktion, manchmal, auch wenn es mit dem korrekten Betrieb von anderen Teilen der API stört), ist die VirtualizingPanel zu finden und ihm ausdrücklich sagen, zu blättern.

Zum Beispiel:

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

Ich bin nicht sehr glücklich mit der Notwendigkeit, durch die visuelle Struktur zu suchen, um das Panel zu finden, aber ich bin mir nicht bewusst jede andere Art und Weise, es zu bekommen, noch zu blättern auf einen bestimmten Index, wenn sie mit einem Virtualisieren von Panel zu tun .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top