2012-09-03 22 views
10

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.

  • CanSelectMultipleItemsTrue ve kullanıcı, SHIFT tuşuna veya fare sürükle kullanarak birden çok öğe seçer DataGrid seçimin sonuna listenin başından itibaren tüm satırları sıralar halinde. Bu numaralandırma ne olursa olsun IList ait uygulanan ya da olmasın IEnumerable 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?

cevap

5

En azından VirtualList'i kandırmanın bir yolunu buldum. Bunu here okuyabilir.

Eğer başka bir çözüm (yani benimkinden bile iyidir) bulduysanız, lütfen söyle!

+0

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 –

İlgili konular