8

Sürekli değişen bir Listeyi (harici model) gösteriyorum (her iki saniyede bir söyleyelim). A ViewModel, PropertyChange olayları için kayıt olan listeyi bilir. Bu ViewModel ayrıca veri bağlama için kullanıcı arayüzüne bir GözlemlenebilirKoleksiyon sağlar. güncellemeler sürekli yapılan yanında iyi çalışıyor PrensipteModelin değişen Listesini ViewModel'in Gözlemlenebilir Listesi ile senkronize etmek için en iyi uygulama?

+-----------------------------------------------+ 
|           View| 
| +-----------+         | 
| |Listbox |         | 
| +-----------+         | 
+-----/\----------------------------------------+ 
     || 
     ||DataBinding 
     || 
     || 
+-----||----------------------------------------+ 
|  ||        ViewModel| 
| +--------------------+   +-------------+| 
| |ObservableCollection|<--------|ChangeHandler|| 
| +--------------------+ / +-------------+| 
|      /  ^  | 
+-------------------------/------------|--------+ 
         /   | 
         /   | 
      Synchronizing Lists   | PropertyChanged 
             | 
             | 
+--------------------------------------|--------+ 
|         +-----+ Model| 
|         |IList|  | 
|         +-----+  | 
|            | 
+-----------------------------------------------+ 

. Her güncellemede kullanıcı seçimini kaybeder, yani tüm güncellemeler ile tüm öğeler seçimden kaldırılır. Bu WPF'nin ListBox'un yeni bir listenin atandığını "gördü" diye hayret verici değil.

Yani, şey değil yeni ObservableCollection atamak yapmak olabilir, ama sorularım Şimdi güncellenmiş Model.List

ile

  • senkronize Listeleri geçerli ObservableCollection içeriğini birleştirmek gerekir - Böyle bir birleştirme yapmak için en iyi uygulamalar (veya çerçeveler) var (Yeni öğeleri ObservableCollection'a kopyala, Eksik olanları silme, değiştirilen öğeleri güncelleştirme)
  • Seçili Öğe - Bunu nasıl temin edebilirim ListBox, seçili olan öğeyi (öğenin kaldırıldığı durumun yanı sıra) saklar.
+4

+1 Güzel diyagram =] –

+1

Teşekkürler. Ben çok görsel bir insanım ve bazı resimlere ihtiyacım var. Jave5 – Seven

cevap

2

Güncelleştirilmiş model listesinden yeni bir ObservableCollection oluşturabilir veya mevcut ObservableCollection'ı modelin biriyle eşzamanlayabilirsiniz.

İkinciye giderseniz, kaçınmak isteyebileceğiniz bir şey, her senkronize edilen öğe için CollectionChanged olaylarını tetiklemektir. Bildirimleri erteleme yeteneği olan this ObservableCollection implementation'a bir göz atın.

Geçerli SelectedItem öğesinin tutulması durumunda, Gözlemlenebilir Toplamanın örneği değiştirilmediyse (doğrudur, koleksiyonları eşitleriz) ve SelectedItem örneği kaldırılmazsa, liste kutusu seçimi tutmalıdır. Ancak, NotifyCollectionChangedEventArgs.Action "Reset" ise, bunun doğru olup olmadığından emin değilim. Bu durumda, kullandığım yaklaşımı, hem bir koleksiyon özelliği hem de ViewModel'de bir SelectedItem özelliğine sahip olabilirsiniz. ViewModel'in SelectedItem öğesini TwoWay modunda ListBox.SelectedItem öğesine bağlarsınız. Koleksiyonları eşitlediğinizde, SelectedItem'i geçici bir değişkene kaydeder ve ardından senkronizasyondan sonra çıkarılmadıysa yeniden uygularsınız.

+0

ile hızlıca tamam, teşekkürler. En kötü hayallerimi doğruladın. Otomatik birleştirme yoktur (kendi Comparer'ımı sağlar). Bu yüzden zaman zaman ertelenen etkinlik ile kendi MergeableCollection yazmak için zaman geldi ;-) – Seven

+0

Şu anda koleksiyonunuzla yaptığınız şeye benzer bir çözüm üzerinde çalışıyorum ve etki alanı modeli ile görünüm modelini eşleştirmek için AutoMapper kullanıyorum. . Bunu yaparsanız, koleksiyondaki gelen modelleri otomatik olarak ViewModel'in koleksiyonunuza birleştirecek bir birleştirme dönüştürücü yazabilirsiniz. Şimdiye kadar kullanmak oldukça güzel ve kolay buldum. [Bu soru] (http://stackoverflow.com/questions/12579328/merge-two-collectios-with-automapper-by-condition), atıfta bulunduğum şeye benziyor – Philter

İlgili konular