CodePlex ve Bea Stollnitz ve Vincent Da Ven Berhge adlı blogun (aynı bağlantı) bloguyla bazı fikirleri kullanarak bir veri sanallaştırma çözümü uyguladı. Ancak farklı bir yaklaşıma ihtiyacım vardı, bu yüzden kendi çözümümü yazmaya karar verdim.DataGrid satırları veri sanallaştırması için istek modelleri
Bu çözümle yaklaşık bir milyon satır görüntülemek için DataGrid
kullanıyorum. Ben de UI sanallaştırma kullanıyorum. Benim çözümüm uygulanabilir, ancak DataGrid
'un kaynağından gelen verileri nasıl talep ettiği konusunda bazı garip davranışlar yaşıyorum. Bütün ağır işliyor bir liste yazma sona erdi çözümü
Hakkında
. VirtualList<T>.
adında genel bir sınıftır. ICollectionViewFactory
arabirimini uygular, böylece koleksiyon görünümü oluşturma mekanizması onu sarmak için bir VirtualListCollectionView<T>
örneği oluşturabilir. Bu sınıf ListCollectionView
'dan devralınır. Kendi ICollectionView
uygulamasını yazmam için önerileri takip etmedim. Devralma iyi çalışıyor gibi görünüyor.
VirtualList<T>
sayfalarına bütün verileri böler. Toplam öğe sayısını alır ve her zaman DataGrid
liste dizinleyici üzerinden bir satır ister, uygun sayfayı yükler veya önbellekten döndürür. sayfalar içinde geri dönüştürülüyor ve bir DispatcherTimer
boşta sürede kullanılmayan sayfaları yok eder.
Veri isteği desenler VirtualList<T>
IList
(non jenerik) hayata geçirmesi gerektiğini
öğrendiğim ilk şey,. Aksi takdirde,
ItemsControl
,IEnumerable
olarak davranır ve tüm satırları sorgular/sıralar. Bu mantıksaldır,DataGrid
güvenli olmadığından,IList<T>
arabirimini kullanamaz.0 dizinli satır, sık sık
DataGrid
tarafından sorulur. Görsel madde ölçümü için kullanılır (çağrı yığına göre). Yani, bunu sadece önbelleğe aldım.DataGrid
içinde önbelleğe alma mekanizması gösterir satır sorgulamak için bir tahmin modelini kullanır. İlk önce, görünür satırları yukarıdan aşağıya doğru sorar (her satır için iki kez), sonra, görünür alandan (ilk görünür satır dahil) azalan bir satırda birkaç satır (görünür alanın boyutuna bağlı olarak) sorgular. aşağıdan yukarıya doğru sıralayın. Bundan sonra, görünür satırlardan sonra (son görünür satır dahil) aşağıdan yukarıya doğru aynı satır satırları istenir.Görünür satır dizinleri 4,5,6 ise. Veri talebi: 4,4,5,5,6,6,4,4,3,2,1,6,7,8,9. Benim sayfa boyutu düzgün ayarlanırsa
, ben şimdiki ve daha önce yüklenmiş sayfadan tüm bu isteğine yanıt verebilir.
CanSelectMultipleItems
True
ve kullanıcı, SHIFT tuşuna veya fare sürükle kullanarak birden çok öğe seçerDataGrid
seçimin sonuna listenin başından itibaren tüm satırları sıralar halinde. Bu numaralandırma ne olursa olsunIList
ait uygulanan ya da olmasınIEnumerable
arayüzü yoluyla gerçekleşir.Seçilen satır görünmüyor ve seçili satır seçili satırdan "uzak" ise, bazen DataGrid seçili satırdan görünür alanın sonuna kadar tüm öğeleri istemeye başlar. Aradaki tüm satırlar dahil, görünür olmayanlar. Bu davranışın tam modelini anlayamadım. Belki de benim uygulamam bunun sebebidir.
Sorularım
-
merak ediyorum
, neden görünür olunca bu satırlar tekrar talep edilecektir beri görünmeyen satırlar için
DataGrid
istekleri?Neden iki ya da üç kez her satır istemek için gereklidir?
herkes nasıl DataGrid birden öğesi seçimini kapatarak hariç
IEnumerable
kullanmamaya yapmak bana söyleyebilir misiniz?
Evet, aslında benzer bir şey yapmak sona erdi. Yüklediğim tüm eşyaları iade ediyorum ve başka bir şey yok. O zamandan beri sorun çıkmadı. Teşekkürler –