2013-08-28 9 views
7

के बीच मध्यस्थता संचार मैं दृश्य मॉडल के लिए मॉडल डेटा में परिवर्तन संवाद स्थापित करने के लिए विभिन्न दृष्टिकोण पढ़ा है। कुछ सुझाव है कि मॉडल INotifyPropertyChanged को लागू करना चाहिए जहां संभव हो, इतना है कि यह बदल गुण को देखते मॉडल सूचित कर सकते हैं। कुछ मॉडल और देखने मॉडल के बीच एक सेवा परत सुझाव है, सेवा परत INPC को लागू करने के साथ, विधि ताकि सेवा परत दृश्य मॉडल को सूचित करता है मॉडल के लिए इस सेवा परत के माध्यम से आने कॉल।WPF MVVM: INPC और देखने मॉडल और मॉडल

मैं बाद वाले को पूर्व के अधिक बारीक संशोधन के रूप में मानता हूं और अपने मॉडल वर्गों में आईएनपीसी लागू करना शुरू कर देता हूं। यह गलत लगता है क्योंकि

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

बी) देखें मॉडल अब मेरे मॉडल के साथ स्ट्रिंग्स के समूह के माध्यम से जुड़ा हुआ है जो पूरी तरह से कॉन्फ़्रेंस द्वारा विनियमित होते हैं I.e no 'इंटरफ़ेस' परिभाषित नहीं किया जाता है। आईडीई का कारण बनने में कठिनाई का जिक्र नहीं है।

सी) इस मॉडल को समायोजित करने के लिए मेरे मॉडल को संशोधित किया जाना है! क्या होगा यदि यह किसी कारण से बंद था? मैंने सोचा था कि इस तरह के पैटर्न कोड पुन: प्रयोज्यता & चिंताओं का पृथक्करण बढ़ाने के लिए डिज़ाइन किए गए थे। इतना ही नहीं, लेकिन आईएनपीसी घटनाओं को आग लगाने के लिए आवश्यक कोड कठिन और दोहरावदार है और वास्तव में अमूर्त नहीं है।

मैं वास्तव में जानना चाहता हूं कि डब्ल्यूपीएफ पेशेवर इस समस्या से कैसे निर्भर करते हैं चाहे निर्भरता गुण आदि। मुझे लगता है कि मुझे कुछ याद आ रहा है। मैं 'ढांचे से' सीखना चाहूंगा जैसे ढांचे का उपयोग करने के लिए उत्सुक नहीं हूं। मैं WPF से दूर एक या दो साल और AngularJS के साथ काम कर हाल ही में मुझे मेरे तरीकों यहाँ सवाल बना दिया है के लिए किया गया है।

धन्यवाद!

+0

जब आप 'मॉडल' कहें तो आप वास्तव में क्या कह रहे हैं? क्या आपका मतलब व्यवसाय वस्तुओं/डेटा प्रकार वर्ग, कोड जो डेटा स्रोत से जुड़ता है, या दोनों? – Sheridan

+0

मैं व्यवसाय डेटा और कार्यक्षमता का जिक्र कर रहा हूं। इस मामले में मेरे मॉडल वर्ग "टेस्ट" ("विवरण", "परिणाम" जैसे गुण, "रन" जैसे विधियां) और "टेस्टप्लेन" वीएम के साथ "टेस्टप्लेमोडेल" "टेस्टप्लान व्यू मॉडेल" हैं। –

+0

आपको अपने मॉडल के लिए आईएनपीसी की आवश्यकता नहीं है, केवल आपका व्यू मॉडल। यह आपके वीएम का पूरा बिंदु है - मैंने देखा है कि लोग अपने मॉडल में आईएनपीसी डालते हैं लेकिन यह मुझे मॉडल के बजाए इसे एक आदर्श मॉडल बनाने के रूप में मारता है। –

उत्तर

5

इस उत्तर के उद्देश्य के लिए, मैं व्यवसाय ऑब्जेक्ट क्लास के डेटा प्रकारों को कॉल करूंगा।

मेरे व्यक्तिगत अनुभव में, मॉडल देखें हमेशा डेटा प्रकारों से जुड़ा हुआ है। आपके पास उन प्रकारों के गुण होना चाहिए जिन्हें आप प्रदर्शित करना चाहते हैं, इसलिए दृश्य मॉडल नामस्थान से डेटा प्रकार नामस्थान में हमेशा संदर्भ होगा।

जिसे आप एक मॉडल कहते हैं (आपकी टिप्पणी में आपके विवरण से) मेरे दृश्य मॉडल की तरह लगता है। मेरे दृश्य मॉडल में गुण होते हैं, अधिकांशतः विभिन्न प्रकार के डेटा प्रकारों और विधियों के प्रकार, जबकि मेरे डेटा प्रकार वर्गों में अधिकांश भाग के लिए गुण होते हैं ... वे केवल डेटा धारकों और परिवर्तनों के संवाददाता हैं।

आप इस धारणा के तहत प्रतीत होते हैं कि INotifyPropertyChanged इंटरफ़ेस 'मॉडल' के बीच कुछ कर्तव्यों का पालन करता है जैसा कि आप इसे कहते हैं और दृश्य मॉडल कक्षाएं ... मेरी राय में, यह सबसे अच्छा है ... INotifyPropertyChanged Interface से एमएसडीएन पर पृष्ठ:

INotifyPropertyChanged इंटरफ़ेस का उपयोग ग्राहकों को सूचित करने के लिए किया जाता है, आमतौर पर ग्राहकों को बाध्य करने के लिए, एक संपत्ति मूल्य बदल गया है।

इसलिए, मैं 'जीवन-रक्त' कि विचारों और देखने मॉडल और डेटा वस्तुओं के बीच चला जाता है के रूप में INotifyPropertyChanged इंटरफेस देखते हैं।कुछ डेवलपर प्रत्येक डेटा प्रकार को अपने स्वयं के दृश्य मॉडल में 'लपेटना' पसंद करते हैं, लेकिन मैं सीधे अपने डेटा प्रकारों में INotifyPropertyChanged इंटरफ़ेस को लागू करना पसंद करता हूं।

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

यह प्रत्येक डेटा प्रकार वर्ग के लिए मिलान दृश्य मॉडल कक्षाएं बनाने में समय बचाता है। दो कक्षाएं क्यों कर सकती हैं जो कोई कर सकती है? मुझे कभी उस अलगाव के स्तर की आवश्यकता नहीं है। अगर मैं आपको सही ढंग से समझता हूं, तो आपके डेटा प्रकार वर्गों में इस इंटरफ़ेस को लागू करने से आपके बिंदु को करने की आवश्यकता को अस्वीकार कर दिया जाएगा)।

अपने अंक ख) और से कुछ ग) भी अवैध प्रस्तुत हो सकते हैं आप .NET 4.5 के रूप में वहाँ एक नया CallerMemberNameAttribute विशेषता है कि आप स्वचालित रूप से PropertyChanged हैंडलर के लिए प्रत्येक प्रॉपर्टी के नाम को खिलाने के लिए उपयोग कर सकते हैं उपयोग कर सकते हैं । मुझे इसके बारे में अच्छी जानकारी के साथ C# 5–Making INotifyPropertyChanged Easier नामक एक अच्छा लेख मिला।

मैंने अब कई बड़े पैमाने पर WPF अनुप्रयोगों और कुछ ढांचे को लिखा है और मुझे अपने डेटा प्रकार वर्गों में INotifyPropertyChanged इंटरफ़ेस को लागू करने में कोई समस्या नहीं है। असल में, मुझे नहीं लगता कि मैं उन्हें एक ही समय में लिख सकता था अगर मुझे प्रत्येक डेटा प्रकार वर्ग के लिए रैपर व्यू मॉडल कक्षाओं को लागू करना पड़ा। इस विधि ने मुझे अब तक अच्छी तरह से सेवा दी है और मैं इसके साथ चिपके रहने की योजना बना रहा हूं, जब तक कि मुझे कम से कम एक बेहतर तरीका न मिल जाए। हालांकि यह सिर्फ एक डेवलपर की राय है और आपको अपने लिए सही महसूस करने के साथ जाना होगा।

+0

वाह महान जवाब, इसे लिखने के लिए समय लेने के लिए धन्यवाद। क्या मैं आपको यह कहकर सही ढंग से व्याख्या कर रहा हूं कि आपके व्यू मॉडल आपके मॉडल वर्गों के उर्फ ​​डेटा प्रकारों के उदाहरण सामने आते हैं जो खुद को नोटिफ़ायर हैं, क्योंकि प्रत्येक मॉडल को व्यक्तिगत रूप से प्रॉक्सी करने वाले व्यू मॉडल के विपरीत? एमवीवीएम की मेरी समझ स्क्रीन पर प्रदर्शित डेटा को मॉडल करना है। आप प्रति मॉडल वर्ग/डेटा प्रकार के आधार पर या प्रति दृश्य आधार पर ऐसा कर सकते हैं, मुझे लगता है कि बाद की पंक्तियां जो आप सुझाते हैं उसके साथ? –

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