Czy LongListSelector obsługuje wirtualizację danych? Czytałem na kilku blogach, że to działa, ale nie mogę go uruchomić.

Oto, co próbowałem: dostarczyłem implementację IList jako ItemsSource na Listę. Problem polega na tym, że Lista wywołuje GetEnumerator() zamiast this[int index], aby uzyskać element listy.

Więc moje pytanie: Jak zaimplementować wirtualizację danych dla LongListSelector?

7
thumbmunkeys 21 lipiec 2011, 01:21
Czy chcesz wirtualizować dane na grupach, czy na wszystkich elementach?
 – 
Claus Jørgensen
24 lipiec 2011, 21:20
Na grupach. grupy zawierają elementy, więc LongListSelector powinien czytać tyle grup, ile potrzebuje, dopóki nie będzie wystarczającej liczby grup i elementów.
 – 
thumbmunkeys
25 lipiec 2011, 11:41
1
Tak, ale należy pamiętać, że LongListSelector używa do wyświetlania danych kolekcji zagnieżdżonej. Najprawdopodobniej musiałbyś więc wirtualizować zarówno wewnętrzną, jak i zewnętrzną kolekcję.
 – 
Claus Jørgensen
25 lipiec 2011, 11:47
@claus: dzięki za szybką odpowiedź. czy mógłbyś podać przykład, jak to działa? W moim programie każda grupa zawiera listę pozycji. czy to jest odpowiednia struktura danych do wirtualizacji?
 – 
thumbmunkeys
25 lipiec 2011, 11:56
2
Nie. Ponieważ, jak powiedziałeś, LongListSelector nadal opiera się na GetEnumerator, nawet podczas renderowania typów IList. Najprawdopodobniej kontrola musiałaby zostać napisana od nowa, aby wspierać cel. Chociaż blogi mogą powiedzieć, że to popierają, żaden z nich nie mówi jak, więc nie jestem skłonny im wierzyć. Domyślną wartością LongListSelector jest renderowanie wszystkich elementów. I na przykład 100 000 elementów renderuje się natychmiast, więc nie widzę obaw, które wymagają wirtualizacji danych w pierwszej kolejności.
 – 
Claus Jørgensen
25 lipiec 2011, 12:18

2 odpowiedzi

Najlepsza odpowiedź

Jak powiedziałeś, LongListSelector nadal opiera się na GetEnumerator, nawet podczas renderowania typów IList. Najprawdopodobniej kontrola musiałaby zostać napisana od nowa, aby wspierać cel. Chociaż blogi mogą powiedzieć, że to popierają, żaden z nich nie mówi jak, więc nie jestem skłonny im wierzyć. Domyślną wartością LongListSelector jest renderowanie wszystkich elementów.

Jeśli chodzi o ładowanie danych, można to zrobić progresywnie za pomocą ObservableCollection. Mam przykładowy projekt, który pokazuje, jak używać ObservableCollection w połączeniu z LongListSelector .

Zasadniczo może to pozwolić na stopniowe dodawanie większej liczby grup i/lub większej ilości danych do grup, a interfejs użytkownika powinien odpowiednio się aktualizować.

5
Claus Jørgensen 20 grudzień 2011, 08:34
Przykładowy link do projektu, odmowa dostępu.
 – 
Derek Beattie
20 grudzień 2011, 07:56
Jest teraz na GitHub. Link naprawiony.
 – 
Claus Jørgensen
20 grudzień 2011, 08:34
4
Um, teraz przykładowy projekt zniknął.
 – 
swinefeaster
24 styczeń 2013, 04:40

Spojrzałem na kod źródłowy LongListSelector, NIE jest możliwe zwirtualizowanie magazynu kopii zapasowej. LongListSelector ładuje każdy element z listy grup za pomocą pętli foreach.

1
CadErik 16 kwiecień 2012, 08:02