8

मेरे पास एक (बाहरी) मॉडल है जो एक सूची को उजागर करता है जो लगातार बदलता है (चलिए हर दो सेकंड या तो कहते हैं)। एक व्यू मॉडेल जानता है कि PropertyChange घटनाओं के लिए पंजीकरण सूची। वह व्यूमोडेल डेटा बाइंडिंग के लिए यूआई को एक ऑब्जर्जेबल कोलेक्शन भी प्रदान करता है।व्यू मॉडेल के एक पर्यवेक्षण सूची में मॉडल की बदलती सूची को सिंक्रनाइज़ करने के लिए सर्वोत्तम अभ्यास?

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

सिद्धांत रूप में जो लगातार काम करता है, इसके अलावा लगातार अद्यतन किए जाते हैं। प्रत्येक अपडेट के साथ उपयोगकर्ता अपना चयन खो देता है, यानी सभी वस्तुओं को हर अपडेट के साथ अचयनित किया जाएगा। यह कोई आश्चर्य की बात नहीं है, क्योंकि डब्ल्यूपीएफ के लिस्टबॉक्स "देखता है" कि एक नई सूची असाइन की गई थी।

तो, बात होना चाहिए कि हम ऐसा नहीं एक नया ObservableCollection आवंटित है, लेकिन अद्यतन Model.List

अब के साथ वर्तमान ObservableCollection की सामग्री के विलय मेरे सवालों

  • सिंक्रनाइज़ किया जा रहा सूचियाँ - क्या इस तरह के विलय (ऑब्जेर्जेबल कोलेक्शन में नए आइटम कॉपी करें, गुमशुदा वस्तुओं को अपडेट करना, बदली हुई वस्तुओं को अपडेट करना) पर सर्वोत्तम प्रथाएं (या ढांचे) हैं
  • चयनित आइटम - मैं कैसे आश्वस्त कर सकता हूं ListBox वर्तमान में चयनित आइटम रखता है (उस मामले के अलावा जिस आइटम को हटा दिया गया था)
+4

+1 अच्छा आरेख =] –

+1

धन्यवाद। मैं एक बहुत ही दृश्यमान व्यक्ति हूं और कुछ चित्रों की आवश्यकता है। Jave5 – Seven

उत्तर

2

आप या तो अद्यतन मॉडल सूची से एक नया ऑब्जर्जेबल चयन कर सकते हैं या मॉडल के साथ वर्तमान ऑब्जर्जेबल कोलेक्शन सिंक कर सकते हैं।

यदि आप दूसरे के लिए जाते हैं, तो एक चीज जिसे आप टालना चाहते हैं, संग्रहित करना है प्रत्येक सिंक किए गए आइटम के लिए संग्रह बदलें। this ObservableCollection implementation पर एक नज़र डालें जिसमें अधिसूचनाओं को स्थगित करने की क्षमता है।

वर्तमान चयनित इटैम को रखने के लिए, यदि ऑब्जर्वेबल कोलेक्शन का उदाहरण बदला नहीं गया है (सत्य क्या है, क्योंकि हम संग्रह को सिंक कर रहे हैं) और चयनित इटैम इंस्टेंस को हटाया नहीं गया है, तो सूची बॉक्स में चयन होना चाहिए। हालांकि, मुझे यकीन नहीं है कि अगर यह सही है तो NotifyCollectionChangedEventArgs.Action "रीसेट" है। यदि ऐसा है, तो आप मेरे द्वारा उपयोग किए जाने वाले दृष्टिकोण का उपयोग कर सकते हैं, जो व्यूमोडेल में एक संग्रह संपत्ति और चयनित इटैम संपत्ति दोनों है। आप ViewModel के चयनित इटैम को ListBox में जोड़ते हैं। दोवे मोड में चयनित Item। जब आप संग्रह को सिंक्रनाइज़ करते हैं, तो आप चयनित इटैम को एक अस्थायी चर में सहेजते हैं और सिंक्रनाइज़ेशन के बाद इसे हटाए जाने पर इसे पुन: लागू करते हैं।

+0

के साथ तेज़ी से किया गया, धन्यवाद, धन्यवाद। आपने मेरी सबसे बुरी कल्पनाओं की पुष्टि की। कोई स्वचालित विलय नहीं है (अपना खुद का तुलनाकर्ता प्रदान करना)। तो अब स्थगित घटना को बढ़ाने के साथ अपना खुद का मर्ज करने योग्य चयन लिखने का समय है ;-) – Seven

+0

मैं वर्तमान में आपके संग्रह के साथ जो कुछ कर रहा हूं उसके समान समाधान पर काम कर रहा हूं और मैं डोमेन मॉडल के बीच मानचित्र बनाने और मॉडल देखने के लिए ऑटोमैपर का उपयोग कर रहा हूं । यदि आप ऐसा करते हैं तो आप एक विलय कनवर्टर लिख सकते हैं जो संग्रह में आने वाले मॉडलों को स्वचालित रूप से आपके व्यूमोडेल के संग्रह में विलय कर देगा। मैंने इसे अब तक बहुत अच्छा और उपयोग करने में आसान पाया है। [यह सवाल] (http://stackoverflow.com/questions/12579328/merge-two-collectios-with-automapper-by-condition) जैसा कि मैं जिक्र कर रहा हूं – Philter

संबंधित मुद्दे