2011-03-04 11 views
6

क्या यह श्रोता वैध है?डब्ल्यूपीएफ एमवीवीएम पृष्ठभूमि वर्कर पर व्यू मॉडल अपडेट कर रहा है

मेरे पास एक आइटम बनाए रखने के लिए एक दृश्य है।

मेरे पास एक मॉडल है जो आइटम ऑब्जेक्ट को लागू करता है (INOTifyPropertyChanged लागू करता है) एक संपत्ति के रूप में दृश्य है।

क्या यह मेरे लिए ऑब्जेक्ट ऑब्जेक्ट को बैकग्राउंडवर्कर को पास करने के लिए मान्य है, जहां इसे संशोधित किया गया है, फिर जब पृष्ठभूमि वर्किंग पूरा हो जाए तो PropertyChanged ईवेंट बढ़ाएं?

या पृष्ठभूमिवर्कर को आइटम ऑब्जेक्ट को किसी भी तरह संशोधित नहीं करना चाहिए। मैं पृष्ठभूमि आइटम द्वारा वापस किए गए परिणामों के साथ मौजूदा आइटम ऑब्जेक्ट को अपडेट कर दूंगा। यह RunWorker पूर्ण घटना में किया जाएगा। लेकिन क्या यह यूआई थ्रेड को लॉक करता है और बैकगाउंड वर्कर रखने की वस्तु को हरा देता है?

उलझन में?

मैं समझाने की कोशिश करूंगा।

उपयोगकर्ता आइटम बनाने का विकल्प लेता है। मैं दृश्य और दृश्य मॉडल बनाते हैं। व्यू मॉडल में एक खाली आइटम ऑब्जेक्ट बनाया गया है। उन्हें आइटम को बनाए रखने के लिए एक दृश्य प्रस्तुत किया गया है। आइटम प्रकार की संपत्ति का चयन करने पर, यह उपयोगकर्ता द्वारा दर्ज किए जाने वाले प्रोरर्टीज़ की सूची बनाने के लिए एक जटिल प्रक्रिया को प्रेरित करता है। जब सूची बनाई जाती है तो मैं यूआई थ्रेड को अवरुद्ध कर सकता हूं लेकिन इससे खराब उपयोगकर्ता अनुभव मिलता है। UI को जीवित रखते हुए मैं प्रसंस्करण को पृष्ठभूमि थ्रेड पर पास करना चाहता हूं। वर्तमान में, मैंने दृश्य पर अनुभाग को इंगित करने के लिए ध्वज सेट किया है, आइटम ऑब्जेक्ट को BackgroundWorker पर पास करें जो गुणों के अवलोकन संग्रह को अद्यतन करता है। जब पृष्ठभूमि कार्य पूरा हो जाता है, तो मैं PropertyChanged ईवेंट को कॉल करता हूं जो दृश्य के अनुभाग को अद्यतन करता है जो सूची में बाध्य है और खंड लोड होने का संकेत देने के लिए ध्वज बंद कर देता है। ऐसा कोई समस्या नहीं है। लेकिन मुझे लगता है कि मुझे बैकग्राउंड थ्रेड में व्यू मॉडल से बाध्य इंजेक्शन अपडेट नहीं करना चाहिए।

धन्यवाद टिम

उत्तर

8

यह ठीक लगता है। जब तक आपका आइटम-ऑब्जेक्ट कोईDependencyObject है, तो आप पृष्ठभूमि कार्यकर्ता में उनके गुणों को बदल सकते हैं।
आपकी ऑब्जेक्ट के गुणों के लिए डेटा बाइंडिंग काम करेगी, बाध्यकारी इंजन स्वचालित रूप से आपके लिए थ्रेड-स्विचिंग करेगा।
हालांकि, डेटा-बाध्य संग्रह को भरें या बैकएंडेंसी ऑब्जेक्ट्स (जैसे यूआई-कंट्रोल) के गुणों को कुशलतापूर्वक प्रेषित किए बिना पृष्ठभूमि कार्यकर्ता में गुणों का उपयोग न करें। यह एक अपवाद का कारण बन जाएगा।

संपादित करें:
केवल स्पष्टीकरण के लिए: यदि आइटम-वस्तु एक DependencyObject है, लेकिन असली सवाल नहीं है अगर संपत्ति एक CLR-property या एक DependencyProperty है। क्योंकि निर्भरता प्रॉपर्टीज निर्भरता ऑब्जेक्ट्स के लिए बाध्य हैं, मैं अक्सर उपर्युक्त सरलीकरण का उपयोग करता हूं, लेकिन यह पूर्ण सत्य नहीं है।
इसका मतलब है कि यदि आपके पास सीएलआर-प्रॉपर्टी है, तो आप अपनी मान को विदेशी धागे से सेट कर सकते हैं, भले ही आपकी कक्षा DepenendencyObject है या नहीं। यह मेरे पहले बयान में थोड़ा अंतर है।

+0

वाह, सुपर फास्ट उत्तर धन्यवाद। क्या आप समझ सकते हैं कि मैनिपुलेशन को डिस्पैच करके आप क्या मतलब रखते हैं? – Tim

+0

@Tim: क्षमा करें मेरी अंग्रेजी। मेरा मतलब यूआई-थ्रेड के डिस्पैचर के साथ ऑपरेशन का आह्वान करना है। प्रेषक सही (UI) थ्रेड में ऑपरेशन के निष्पादन को शेड्यूल करेगा। http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.aspx – HCL

+0

धन्यवाद, बस एक परीक्षण चलाएं और वास्तव में मुझे एक त्रुटि मिलती है। जांच करेगा। – Tim

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