2013-01-15 7 views
6

Dodanie do post z 4 miesięcy temu, które niestety nie otrzymały żadnej odpowiedzi.Żądania DataGrid podczas wieloselekcji przesunięcia z wirtualizacją danych

Zasadniczo stoję przed tym samym problemem podczas korzystania z wielokrotnego wyboru w datagrid z przesunięciem.

Znajdując się gdzieś pośrodku ogromnej listy (powiedzmy, że jest to 1 000 000 elementów w siatce, wszystkie dane wirtualizowały) i miałem wybrać od 500 000 do 500,050 za pomocą shift + kliknięcie myszką, siatka nazywa "GetEnumerator()" "metoda mojej wirtualnej listy (podobna implementacja do Vincenta i Paula). To, co robiłem do tej pory, było tylko zaznaczeniem na stronach z pamięci podręcznej. Ale niestety spowodowało to, że wiersze nie zostały poprawnie wybrane (podczas gdy ctrl + kliknięcie myszką wykonuje zadanie!).

Więc znalazłem, że DataGrid faktycznie oczekuje wszystkie przedmiotów od indeksu 0 do ostatniego wyboru. To oczywiście nie jest idealne dla listy 1m pozycji, ponieważ spowodowałoby to żądania dla każdego elementu od 0 do (w moim przykładzie) 500,050, a tym samym ładowanie wszystkiego z bazy danych.

Więc moje pytania byłyby takie same jak te Daniel TH elinked pisał powyżej:

  • Dlaczego żądania DataGrid przedmiotów wielokrotnie (wybrane pozycje są o ~ 6-7 razy z rzędu dla bez wyraźnego powodu)?

  • Czy istnieje sposób na to, aby DataGrid nie korzystał z modułu wyliczającego i po prostu wybierał wybrane elementy, a nie dokonywał iteracji od 0?

Dziękuję bardzo, mam nadzieję, więcej szczęścia w uzyskaniu przynajmniej inspirującej odpowiedzi, jak nie ma wiele można znaleźć dotycząca wirtualizacji danych.

Odpowiedz

3

Znalazłem rozwiązanie tego problemu (przynajmniej mogę powiedzieć, że działa dla mnie).

Co ja w zasadzie nie było oszukiwanie VirtualList jako takie, że robię następujący kod:

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

ten sposób będę zawsze dostajesz rzeczy, które są naprawdę na liście, ale nic nie wrócić, gdy jest to część wirtualizacji.

Oczywiście może to powodować inne problemy, ale jest to jak dotąd najbliżej dotyczące tego problemu.

Powiązane problemy