2013-01-15 5 views
6

Addition auf eine post von 4 Monaten, die leider keine Antwort erhalten.DataGrid-Anfragen, wenn Shift Multiselection mit Datenvirtualisierung

Ich stehe grundsätzlich vor dem gleichen Problem bei der Verwendung von Multiselection in einem Datagrid mit Shift.

Wenn irgendwo in der Mitte einer riesigen Liste (sagen wir es 1.000.000 Elemente im Raster, alle Daten virtualisiert) und ich von 500.000 bis 500.050 mit Shift + Mausklick auswählen, ruft das Raster die "GetEnumerator() "Methode meiner virtuellen Liste (ähnliche Implementierung zu Vincents und Pauls). Was ich bis jetzt gemacht habe, war nur ein SelectMany auf den zwischengespeicherten Seiten. Leider wurden die Zeilen nicht richtig ausgewählt (während Strg + Mausklick den Job erledigt!).

Also was ich gefunden habe, ist, dass das DataGrid tatsächlich alle Elemente von Index 0 bis zum letzten der Auswahl erwartet. Dies ist offensichtlich nicht ideal für eine Liste von 1m Elementen, da dies zu Anfragen für jedes Element von 0 bis (in meinem Beispiel) 500.050 führen würde und somit alles aus der Datenbank laden würde.

So wären meine Fragen die gleichen wie die von Daniel in th oben gepostet elinked:

  • Warum funktioniert die Datagrid Anforderungspositionen mehrfach (ausgewählte Positionen werden gebeten ~ 6-7 Mal in Folge kein ersichtlicher Grund)?

  • Gibt es eine Möglichkeit, dem DataGrid mitzuteilen, den Enumerator nicht zu verwenden und nur die ausgewählten Elemente auszuwählen und nicht von 0 an zu durchlaufen?

Vielen Dank, in der Hoffnung ich mehr Glück habe zumindest immer Antworten zum Nachdenken anregend, da gibt es nicht viel zu über Datenvirtualisierung gefunden.

Antwort

3

Ich habe eine Lösung für dieses Problem gefunden (zumindest kann ich sagen, es funktioniert für mich).

Was ich im Grunde die VirtualList als solche hat täuschte, dass ich den folgenden Code:

for (int i = 0; i < Count; i++) 
{ 
    int pageIndex = i/PageSize; 
    int pageOffset = i%PageSize; 
    IList<TItem> page; 
    if (pages.TryGetValue(pageIndex, out page)) 
    { 
    yield return page[pageOffset]; 
    } 
    yield return default(TItem); 
} 

Auf diese Weise werde ich immer die Einzelteile erhalten, die wirklich in der Liste enthalten sind, aber nichts zurück, wenn es ein Teil ist der Virtualisierung.

Natürlich kann dies zu einigen anderen Problemen führen, aber das ist so weit das nächste, was ich diesbezüglich habe.