दिलचस्प पोस्ट
मैं एक regex का उपयोग कर एक स्ट्रिंग में सभी YouTube वीडियो आईडी कैसे प्राप्त करूं? जावा में दिए गए आकार के साथ फ़ाइल बनाएं __gnu_mcount_nc के साथ समारोह से बाहर निकलने का समय कैप्चर करना वेब सर्वर के रूप में आईओएस डिवाइस कैसे जावा इंटरफेस कई विरासत अनुकरण करते हैं? addKeyListener () JPanel के लिए काम नहीं करता है Android में AsyncTask के लिए सामान्य वर्ग? HTML ड्रॉपडाउन सूची में MySQL डाटाबेस से डेटा प्राप्त करना स्विफ्ट रेंज से एनएसआरेंज? कस्टम सूचना लेआउट और पाठ रंग आईएस में जेसन प्रतिक्रिया डाउनलोड (7 ~ 10) सी # में एक रजिस्ट्री मान को कैसे हटाएं अनचाहे त्रुटि: SECURITY_ERR: DOM अपवाद 18 जब मैं एक कुकी सेट करने का प्रयास करता हूं आईफ़ोन: क्या हम UIWebView का उपयोग कर पीडीएफ फाइल खोल सकते हैं? Google के ऐप इंजिन एसडीके और क्लाउड एसडीके के बीच संबंध क्या है?

MVVM में ViewModel या मॉडल को INotifyPropertyChanged को लागू करना चाहिए?

अधिकांश एमवीवीएम उदाहरण जिनके माध्यम से मैंने काम किया है, ने मॉडल को इनोटेफप्रोटीटी बदल दिया है, लेकिन जोश स्मिथ के कमांड सिंक उदाहरण में ViewModel लागू INotifyPropertyChanged है

मैं अभी भी समझदारी से एमवीवीएम अवधारणाओं को एक साथ रख रहा हूं, इसलिए मुझे नहीं पता है कि:

  • आपको काम करने के लिए CommandSink प्राप्त करने के लिए ViewModel में INotifyPropertyChanged डाल दिया है
  • यह सिर्फ आदर्श का एक विपथन है और यह वास्तव में कोई फर्क नहीं पड़ता
  • आपको हमेशा मॉडल को INOTifyPropertyChanged को लागू करना चाहिए और यह सिर्फ एक गलती है जिसे सही किया जाएगा अगर यह एक कोड उदाहरण से एक एप्लिकेशन में विकसित किया गया हो

क्या आपने एमवीवीएम परियोजनाओं पर काम किया है, जो दूसरों के अनुभव हैं?

वेब के समाधान से एकत्रित समाधान "MVVM में ViewModel या मॉडल को INotifyPropertyChanged को लागू करना चाहिए?"

मैं काफी विपरीत कहूंगा, मैंने हमेशा अपने INotifyPropertyChanged को मेरे व्यू मॉडेल पर बदल दिया – आप वाकई अपने मॉडल को प्रदूषित नहीं करना चाहते हैं, जैसे कि INotifyPropertyChanged जैसी काफी विशिष्ट सुविधा, यह सामान INotifyPropertyChanged में बैठना चाहिए।

मुझे यकीन है कि दूसरों को असहमत होगा, लेकिन मैं जिस तरह से काम करता हूं

मैं इस अवधारणा से दृढ़ता से असहमत हूं कि मॉडल को INotifyPropertyChanged लागू नहीं करना चाहिए। यह इंटरफ़ेस UI विशिष्ट नहीं है! यह केवल एक बदलाव की सूचना देता है वास्तव में WPF भारी रूप से परिवर्तनों की पहचान करने के लिए इसका उपयोग करता है, लेकिन इसका यह मतलब नहीं है कि यह एक UI इंटरफ़ेस है। मैं इसे निम्नलिखित टिप्पणी के साथ तुलना करता हूं "एक टायर एक कार सहायक है" यह निश्चित है, लेकिन बाइक, बसों, आदि भी इसका इस्तेमाल करते हैं संक्षेप में उस इंटरफ़ेस को UI चीज़ के रूप में नहीं लेना चाहिए

यह कहने के बाद, यह आवश्यक नहीं है कि मैं मॉडल उपलब्ध कराए गए नोटिफिकेशन में विश्वास करता हूं। अंगूठे के नियम के रूप में वास्तव में, मॉडल को इस इंटरफेस को लागू नहीं करना चाहिए, जब तक यह आवश्यक न हो। अधिकांश मामलों में जहां कोई सर्वर डेटा क्लाइंट ऐप में नहीं धकेल जाता है, मॉडल बासी हो सकता है। लेकिन अगर वित्तीय बाजार डेटा को सुनना है, तो मुझे नहीं पता कि मॉडल इंटरफ़ेस क्यों लागू नहीं कर सकता। एक उदाहरण के तौर पर, यदि मेरे पास कोई गैर-यूआई तर्क है, जैसे कि एक ऐसी सेवा जिसे बिड मिलता है या मूल्य पूछने के लिए मूल्य मिलता है तो यह एक चेतावनी – एक ईमेल के माध्यम से – या एक ऑर्डर देता है तो यह एक संभव स्वच्छ समाधान हो सकता है ।

हालांकि, चीजों को प्राप्त करने के विभिन्न तरीके हैं लेकिन मैं हमेशा सादगी के पक्ष में बहस करता हूं और अतिरेक से बचने की कोशिश करता हूं।

क्या बेहतर है? दृश्य-मॉडल पर किसी संग्रह या संपत्ति के परिवर्तन की घटनाओं को परिभाषित करना और इसे मॉडल पर प्रसारित करना या दृश्य को आंतरिक रूप से मॉडल (दृश्य-मॉडल के माध्यम से) अपडेट करना है?

जब भी कोई व्यक्ति दावा करता है कि "आप ऐसा नहीं कर सकते हैं" या नीचे की रेखा के रूप में देखते हैं तो यह संकेत के रूप में है कि वे नहीं जानते कि वे किस बारे में बात कर रहे हैं।

यह वास्तव में आपके मामले पर निर्भर करता है, और वास्तव में एमवीएमएम बहुत सारे मुद्दों के साथ एक रूपरेखा है और मैं अभी तक मंडल में एमवीवीएम के एक कॉमॉम कार्यान्वयन को देखने के लिए नहीं हूं।

मेरा मानना ​​है कि मुझे एमवीवीएम के कई जायके और सामान्य समस्याओं के समाधान के बारे में अधिक समझा गया था – ज्यादातर अन्य डेवलपर्स द्वारा प्रदान किए गए थे – लेकिन मुझे लगता है कि मुझे इसे दूसरी बार करना होगा

एमवी-वीएम में हमेशा ViewModel (मॉडल हमेशा नहीं) INOTifyPropertyChanged लागू करता है

http://blogs.msdn.com/llobo/archive/2009/05/01/download-mv-vm-project-template-toolkit.aspx से एमवी-वीएम प्रोजेक्ट टेम्पलेट / टूलकिट देखें। यह कमांडिंग के लिए DelegateCommand कमांड का उपयोग करता है और यह आपको एमवी-वीएम परियोजनाओं के लिए एक शानदार प्रारंभिक टेम्पलेट होना चाहिए।

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

यदि आप व्यू-मॉडल के बारे में अधिक डेटािकंट्रोलर के बारे में सोचते हैं और आर्किटेक्चर को कार्यान्वित करते हैं, जहां आपके डेटा कंट्रोलर एकमात्र ऐसा आइटम होता है जो डेटा को छूता है, तो आप सीधे डेटा को कभी भी स्पर्श नहीं करेंगे, लेकिन हमेशा डेटा कंट्रोलर का उपयोग करें डेटाकंट्रोलर यूआई के लिए उपयोगी है लेकिन यह केवल यूआई के लिए ही आवश्यक नहीं है। यह व्यावसायिक परत, UI परत, आदि के लिए है …

 DataModel -------- DataController ------ View / Business --------/ 

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

यह इस पर निर्भर करता है कि आपने अपने मॉडल को कैसे कार्यान्वित किया है। मेरी कंपनी लिट्का की सीएसएलए ऑब्जेक्ट्स के समान व्यापारिक वस्तुओं का उपयोग करती है और व्यापार मॉडल के दौरान इनोटेफप्रोटीटी का व्यापक उपयोग करती है।

हमारा सत्यापन इंजन अधिसूचित होने पर भारी निर्भर करता है कि गुणों को इस तंत्र के माध्यम से बदलते हैं और यह बहुत अच्छी तरह से काम करता है। जाहिर है, अगर आप व्यवसाय वस्तुओं के अलावा किसी अन्य कार्यान्वयन का उपयोग कर रहे हैं, जहां परिवर्तन की सूचना ऑपरेशन के लिए महत्वपूर्ण नहीं है, तो आपके व्यवसाय मॉडल में बदलाव का पता लगाने के लिए आपके पास अन्य विधियां हो सकती हैं।

हमारे पास दृश्य मॉडल भी हैं जो मॉडल से आवश्यक परिवर्तनों का प्रचार करते हैं, लेकिन देखें मॉडल खुद को अंतर्निहित मॉडल परिवर्तनों को सुन रहे हैं।

मैं अपने ViewModel में कहूँगा यह आदर्श का हिस्सा नहीं है क्योंकि मॉडल UI अज्ञेयवादी है मॉडल 'सर्वत्र अनजाने व्यापार अज्ञेय' होना चाहिए

लेकिन कभी-कभी (इस प्रस्तुति लिंक टेक्स्ट के रूप में) मॉडल सेवा है, जो कुछ डेटा के साथ ऑनलाइन आवेदन प्रदान करता है और फिर आपको सूचनाओं को लागू करने की आवश्यकता है कि नए डेटा आते हैं या घटनाओं का उपयोग करके डेटा बदल गया है …

यदि आप एमवी-वीएम का पालन करना चाहते हैं तो यह उत्तर काफी स्पष्ट है।

देखें: http://msdn.microsoft.com/en-us/library/gg405484(v=PandP.40).aspx

एमवीवीएम पैटर्न में, दृश्य यूआई और किसी भी यूआई लॉजिक को घेरे में रखते हैं, दृश्य मॉडल प्रस्तुति तर्क और राज्य को कैप्चर करता है, और मॉडल व्यावसायिक तर्क और डेटा को कैप्चर करता है।

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

मुझे लगता है कि यह सभी उपयोग के मामले पर निर्भर करता है।

जब आपके गुणों के लोड के साथ एक सरल मॉडल होता है, तो आप इसे INPC को लागू कर सकते हैं। साधारण से मेरा मतलब है कि यह मॉडल एक पॉको की तरह दिखता है

यदि आपका मॉडल अधिक जटिल है और एक इंटरैक्टिव मॉडल डोमेन में रहता है – मॉडलों को संदर्भित मॉडल, अन्य मॉडलों की घटनाओं की सदस्यता लेना – INPC के रूप में लागू होने वाली मॉडल ईवेंट होने पर एक दुःस्वप्न है

अपने आप को कुछ मॉडल इकाई की स्थिति में रखें, जिसे कुछ अन्य मॉडलों के साथ सहयोग करना है। आपके पास सदस्यता लेने के लिए विभिन्न इवेंट हैं इन सभी को आईएनपीसी के रूप में कार्यान्वित किया गया है। उन ईवेंट हैंडलर की कल्पना करें अगर-क्लाज़ और / या स्विच क्लॉसेस का एक विशाल झरना।

आईएनपीसी के साथ एक और मुद्दा आप अपने क्षुधा को अमूर्त पर निर्भर करने के लिए डिज़ाइन करना चाहिए, न कि कार्यान्वयन। यह आमतौर पर इंटरफेस का उपयोग करके किया जाता है।

चलो एक ही अमूर्त के 2 अलग कार्यान्वयन पर एक नजर है:

 public class ConnectionStateChangedEventArgs : EventArgs { public bool IsConnected {get;set;} } interface IConnectionManagerINPC : INotifyPropertyChanged { string Name {get;} int ConnectionsLimit {get;} /* A few more properties */ bool IsConnected {get;} } interface IConnectionManager { string Name {get;} int ConnectionsLimit {get;} /* A few more properties */ event EventHandler<ConnectionStateChangedEventArgs> ConnectionStateChanged; bool IsConnected {get;} } 

अब उन दोनों को देखें आईसीओएनसीएनेक्शन मैनेजरइनपीसी आपको क्या बताता है? इसकी कुछ संपत्तियों में बदलाव हो सकता है आप नहीं जानते कि उनमें से कौन सा है। वास्तव में डिजाइन यह है कि केवल ईसकेनेक्ट किए गए परिवर्तन हैं, क्योंकि बाकी सब केवल पढ़ने योग्य हैं

इसके विपरीत, IConnectionManager के इरादे स्पष्ट हैं: "मैं आपको बता सकता हूं कि मेरा Isconnected संपत्ति का मान बदल सकता है"।

बस अपने व्यू-मॉडल में INotifyPropertyChange का उपयोग करें और मॉडल में नहीं,

मॉडल आमतौर पर सत्यापन त्रुटियों को संभालने के लिए IDataErrorInfo का उपयोग करता है, इसलिए बस अपने IDataErrorInfo में रखें और आप सही अपनी MVVM सड़क पर हैं

मान लीजिए कि आपके दृश्य में ऑब्जेक्ट का संदर्भ बदलता है सही मूल्य दिखाने के लिए आप सभी गुणों को अपडेट करने के लिए कैसे सूचित करेंगे? OnPropertyChanged को कॉल OnPropertyChanged सभी ऑब्जेक्ट के गुणों के लिए आपके दृश्य में OnPropertyChanged गया है, मेरे दृष्टिकोण को देखने के लिए कचरा है।

तो मैं क्या करता हूं, वस्तु को किसी को सूचित करने के लिए, जब संपत्ति में कोई बदलाव होता है, और मेरे विचार में मैं Object.Property1 जैसी बाइंडिंग का उपयोग करता हूं। Object.Property1 , Object.Property2Object.Property2 और ऑन इस तरह अगर मैं अभी उस ऑब्जेक्ट को बदलना चाहता हूं जो वर्तमान में मेरे विचार में रखी गई है, मैं सिर्फ OnPropertyChanged("Object")

वस्तुओं के लोड होने के दौरान सैकड़ों नोटिफिकेशन से बचने के लिए, मेरे पास एक निजी बूलियन इंडिकेटर है जो मैंने इसे लोड करने के दौरान सही करने के लिए सेट किया है जो ऑब्जेक्ट के OnPropertyChanged और कुछ भी नहीं करता है।

मैं एक मॉडल में INotifyPropertyChange इंटरफ़ेस का उपयोग कर रहा हूँ। दरअसल, यूआई या बाहरी ग्राहक द्वारा केवल एक मॉडल गुण परिवर्तन निकाल दिया जाना चाहिए।

मैंने कई फायदे और नुकसान देखे हैं:

लाभ

नोटिफ़ायर बिजनेस मॉडल में है

  1. डोमेन चालित होने के अनुसार, यह सही है। यह तय करना चाहिए कि कब उठाना और कब नहीं करना चाहिए

नुकसान

मॉडल में संपत्ति (मात्रा, दर, कमीशन, कुल फ़ायदा) है। कुलफ़िल्टर की मात्रा, दर, कमीशन परिवर्तन का उपयोग करके गणना की जाती है।

  1. डीबी से मूल्यों को लोड करने पर, कुल फ़्रीफिट गणना को 3 गुना (मात्रा, दर, कमीशन) कहा जाता है। यह एक बार होना चाहिए

  2. यदि दर, मात्रा को व्यवसाय स्तर में सौंपा गया है, तो फिर नोटिफ़ायर कहलाता है।

  3. संभवतः आधार वर्ग में इसे अक्षम करने का विकल्प होना चाहिए। हालांकि, डेवलपर्स ऐसा करने में भूल गए थे।

आम तौर पर देखें मॉडेल INOTifyPropertyChanged को लागू करेगा। मॉडल कुछ भी हो सकता है (xml फ़ाइल, डेटाबेस या वस्तु भी)। मॉडल का उपयोग व्यू-मॉडल को डेटा देने के लिए किया जाता है, जो दृश्य को प्रचार करता है।

यहाँ देखें

मैं पाउलो के उत्तर से सहमत हूं, INotifyPropertyChanged को लागू करना INotifyPropertyChanged में INotifyPropertyChanged पूरी तरह से स्वीकार्य है और यहां तक ​​कि माइक्रोसॉफ्ट द्वारा सुझाई गई है –

आमतौर पर, मॉडल उन सुविधाओं को लागू करता है जो इसे देखने के लिए बाध्य करना आसान बनाते हैं। इसका आम तौर पर मतलब है कि यह INotifyCollectionChanged और INotifyCollectionChanged इंटरफेस के माध्यम से संपत्ति और संग्रह परिवर्तन सूचना का समर्थन करता है। मॉडल वर्ग, जो ऑब्जेक्ट्स के संग्रह का प्रतिनिधित्व करते हैं, आमतौर पर ObservableCollection<T> कलेक्शन ObservableCollection<T> क्लास से प्राप्त होते हैं, जो INotifyCollectionChanged इंटरफ़ेस का कार्यान्वयन प्रदान करता है।

यद्यपि यह तय करने के लिए कि आप उस प्रकार के कार्यान्वयन चाहते हैं या नहीं, लेकिन याद रखना –

क्या होगा अगर आपकी मॉडल कक्षाएं आवश्यक इंटरफेस लागू नहीं करती हैं?

कभी-कभी आपको मॉडल ऑब्जेक्ट्स के साथ काम करने की आवश्यकता होगी जो INotifyCollectionChanged , IDataErrorInfo , IDataErrorInfo , या INotifyDataErrorInfo इंटरफ़ेस को लागू नहीं करते हैं। उन मामलों में, दृश्य मॉडल को मॉडल ऑब्जेक्ट लपेट और दृश्य के लिए आवश्यक गुणों को बेनकाब करने की आवश्यकता हो सकती है। इन गुणों के मूल्यों को सीधे मॉडल ऑब्जेक्ट्स द्वारा प्रदान किया जाएगा। दृश्य मॉडल उन गुणों के लिए अपेक्षित इंटरफेस को लागू करेगा जो इसे प्रदर्शित करता है ताकि दृश्य आसानी से उनसे डेटा बाँध सकें।

से लिया गया – http://msdn.microsoft.com/en-us/library/gg405484(PandP.40).aspx

मैंने कुछ प्रोजेक्ट्स में काम किया है जहां हमने INotifyPropertyChanged हमारे मॉडल में INotifyPropertyChanged नहीं किया है और इस वजह से हमें कई मुद्दों का सामना करना पड़ा; वीएम में गुणों की अनावश्यक दोहराव की जरूरत थी और साथ ही हमें बीएल / डीएल के पास जाने से पहले अंतर्निहित ऑब्जेक्ट (अपडेट किए गए मान के साथ) को अपडेट करना पड़ा था।

आपको विशेष रूप से समस्याओं का सामना करना पड़ेगा यदि आपको अपने मॉडल ऑब्जेक्ट्स (एक संपादन योग्य ग्रिड या सूची में कहते हैं) या जटिल मॉडल के संग्रह के साथ काम करने की आवश्यकता है; मॉडल ऑब्जेक्ट्स स्वचालित रूप से अपडेट नहीं होंगे और आपको अपने वीएम में सभी का प्रबंधन करना होगा।


मूल रूप से एक और इसी तरह के सवाल पर उत्तर दिया, यहाँ जोड़ने के रूप में यह छोटा सा भूत शामिल है इस थ्रेड से अनुपलब्ध विवरण –

https://stackoverflow.com/a/6923833/45382

imho मुझे लगता है कि व्यू मॉोडल INOTifyPropertyChange लागू करता है और मॉडल एक अलग "स्तर" पर सूचना का उपयोग कर सकता है

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

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