2010-02-12 8 views
6

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

मैं इसे कैसे बना सकता हूं ताकि विवरण सहेजे जाने तक मास्टर अपडेट नहीं किया जा सके? मैं इसे कैसे बना सकता हूं ताकि आप संपादन/जोड़ मोड में मास्टर के वर्तमान चयन को नहीं बदल सकें?

मैं बहुत सारे गुगल रहा हूं लेकिन इसका कोई मांसपेशियों का उदाहरण नहीं मिला है।

धन्यवाद।

पीएस: यह दृश्य एक बड़ी स्क्रीन पर एक बच्चा दृश्य है। यही कारण है कि मैं दोनों मास्टर और विवरण दोनों एक साथ चाहते हैं।

उत्तर

0

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

मैं निम्नलिखित डिजाइन जो कम से कम हैक्स के साथ काम करने लगता है के साथ आया था।

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

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

सूची दृश्य और संपादन दृश्य परस्पर अनन्य हैं। सिद्धांत रूप में आप एक फ्लिप स्क्रीन का उपयोग कर अक्षम विकलांग को छुपा सकते हैं। एक सामान्य पैटर्न के रूप में, मेरे ऐप के लिए एक ही समय में दोनों दृश्यमान होने के लिए बेहतर है क्योंकि संपादन पैनल सूची दृश्य में दिखाए गए अतिरिक्त जानकारी दिखा सकता है। जिस पैनल को सक्षम किया गया है, उसे IsEnabled को IsEnitCommentMode जैसे ViewModel प्रॉपर्टी पर बाध्यकारी द्वारा नियंत्रित किया जाता है।

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

यह सब अच्छी तरह से काम करता है और ऐसा लगता है कि किसी भी एमवीवीएम किरायेदारों (मेरी नम्र लेकिन अक्सर त्रुटिपूर्ण राय में) का उल्लंघन नहीं होता है।

1

आप निश्चित रूप से ऐसा कर सकते हैं, हालांकि मेरी राय में ऐसा यूआई डिज़ाइन WPF की पूर्ण शक्ति का उपयोग करने में विफल रहता है। पुराने WinForms UI आमतौर पर अधिकांश एप्लिकेशन को अद्यतन नहीं करते हैं जब तक कि डेटा SQL सर्वर (या कहीं भी) में सहेजा नहीं गया था क्योंकि उनके पास असली व्यावसायिक ऑब्जेक्ट्स और WPF जैसे शक्तिशाली बाइंडिंग सिस्टम नहीं थे। डब्ल्यूपीएफ के भीतर WinForms सीमाओं की प्रतिलिपि बनाने की कोशिश कर रहा है मेरे लिए एक कदम पीछे की तरह लगता है। मास्टर दृश्य में यूआई में दिखाई देने वाले हर जगह नवीनतम डेटा क्यों नहीं दिखाना है? साथ ही, उपयोगकर्ता को सहेजने से पहले कई आइटम संपादित करने की अनुमति क्यों न दें, उदाहरण के लिए मास्टर व्यू में एनिमेटेड मार्कर के साथ किसी भी संपादित लेकिन सहेजे गए आइटम को चिह्नित करना? इन्हें एक सामान्यीकृत पूर्ववत के साथ संयोजित करें और आपके पास उपयोगकर्ता के लिए एक बेहतर डिज़ाइन और अधिक सहज ज्ञान युक्त है।

लेकिन अगर आपके व्यापार की आवश्यकताओं को यह अत्यंत आवश्यक बनाने के लिए, यहाँ कैसे करना है: विस्तार के बाहर दिखाई देने जब तक यह अपने में

सहेजा जाता है प्रवेश करने पर "से

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

बदलते संपादन में जबकि से मास्टर की वर्तमान चयन की रोकथाम/मोड

दो संभावनाओं जोड़ें:

  1. संपादित के दौरान/मोड जोड़ने के लिए, मास्टर दृश्य माउस अस्वीकृत करने के लिए बदलने के परीक्षण या कुंजीपटल मारा फोकस

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