2010-10-25 18 views
8

Uygulamaların her tarafında gözlemlenebilir koleksiyonlar kullanıyorum. Benim sorunum, bu varlıkları düzenlemek için bir açılır pencere kullandığımda, kullanıcı pencerede ilgili alanları değiştirdiğinde bağlı listelerim değişiyor.WPF ObservableCollection Düzenleme Modu

Gözlemlenebilir değişiklik kurallarını basitçe nasıl dondurup, yalnızca varlık kaydedildiğinde nasıl serbest bırakabilirim?

BoundPropertyOfViewModel = CollectionViewSource.GetDefaultView(AgentDeploymentDetail); 

ve bunun yerine ObservableCollection doğrudan bağlanma bakış bağlamak:

sayesinde Oran

+0

kontrol edin http://stackoverflow.com/questions/2105830/editing-observablecollections-selecteditem- http://stackoverflow.com/questions/269073/observablecollection-that-also-monitors-changes-on-the-elements-in-collection –

cevap

2

Düzenlemek istediğiniz nesnenin bir deep copy olmasını sağlayabilirsiniz. Bu şekilde, düzenleme sırasında, listede kalan orijinali etkilemeden kopya üzerinde hareket edebilirsiniz. Düzenlemeyi tamamladıktan sonra, orijinali düzenlenen sürüm veya geri alma ile değiştirebilirsiniz.

+0

Teşekkür ederiz. Bu yaklaşımı daha önce denedim, ancak iç içe geçmiş nesnelerin serileştirilmesini kullandığı için, bazı nesneler serileştirilemedi ve klonlanmış nesne daha iyi kullanılmadı. – OrPaz

+0

@OrPaz: Nesnelerinizi bir şekilde veya başka bir şekilde yedekleyebilmeniz, özellikle de Thomas tarafından önerildiği gibi IEditableObject arabirimini kullanmayı düşünüyorsanız kritik öneme sahip olabilir. – Matthieu

+0

Nesnenin seri hale getirilmesini veya var olan klonlama nesnelerini kullanarak derinlemesine kopyalamayı denedim. Çalışıyor olsa da, aslında kopyalamak için neredeyse 5 (!) Saniye sürüyor gibi onları kullanamazsınız .... Herhangi bir öneriniz? (Burada yeni bir soru takip ettik: http://stackoverflow.com/questions/4034477/entity-framework-attach-exception-after-clone) – OrPaz

3

kullanabilirsiniz. Bu, koleksiyonunuza dokunmadan çıktınızı filtrelemenize/sıralamanıza izin veren aynı nesnedir.

Değişiklikleri durdurmak istediğinizde DeferRefresh() kullanın. İşiniz bittiğinde, Refresh() numaralı telefonu arayın.

UYARI

Bu işlem her öğe kendisi yalnızca listedeki değişiklikler değil pervent gösteren.

+0

Görülmeyen denetimler-görmek-düzeltmeler öğeler koleksiyona eklendiğinde veya koleksiyondan kaldırıldığında, ancak öğelerin, görünümde yansıtılacak olan "PropertyChanged" bildirimlerini yükseltmesini engellemez. Bu, ... –

+0

Evet haklısın.Sadece listenin burada bir soru olduğunu düşündüm. Cevabımı güncelleyeceğim. – Aliostad

+0

Teşekkür ederim. Temel amacım blok düzenleme değişiklikleri, değişiklik ekleme/kaldırma değil. – OrPaz

5

Sorun, koleksiyon ile değil, varlıkların kendileriyle olduğunu düşünüyorum. ObservableCollection, bir öğe eklendiğinde veya kaldırıldığında, bir öğenin özelliği değiştirildiğinde değişiklik yapılmaz. Bu bölüm, öğe tarafından uygulanan INotifyPropertyChanged tarafından ele alınmıştır, bu yüzden devre dışı bırakmanız gereken bu bildirim.

Bu tür bir senaryo için tasarlanan IEditableObject arabirimine göz atmanızı öneririm. Bildirimleri BeginEdit yönteminde devre dışı bırakabilir ve bunları EndEdit ve CancelEdit içinde yeniden etkinleştirebilirsiniz.


DÜZENLEME: http://www.paulstovell.com/editable-object-adapter

+0

Teşekkürler. Bu yaklaşımla ilgilenmeme rağmen, proje indirme bağlantısı kırılmış gibi görünüyor. – OrPaz

0

Tüm işaretlendiği yukarıdaki büyük: Paul Stovell burada IEditableObject sancının güzel bir uygulama vardır. Ancak, istenen performansı verimli ve temiz bir şekilde yerine getirmek için iyi ve ikna edici bir prosedür buldum. Matthieu MEZIL varlık klonunu (http://msmvps.com/blogs/matthieu/archive/2008/05/31/entity-cloner.aspx) kullanarak, ayrılmış bir nesne üzerinde derin bir kopyasını gerçekleştirmeye dayanır. Tüm detaylar için

izlediklerinizi kontrol edin: büyük destekle Entity Framework Attach Exception After Clone

Teşekkür ...