2010-08-25 15 views
5

मैं सिल्वरलाइट लोब ऐप पर काम कर रहा हूं, जो डिज़ाइनर विजुअल स्टूडियो के इंटरफ़ेस के समान टैबबैड-इंटरफेस रखना चाहते हैं (हम शायद डॉकिंग टैब के लिए टेलीरिक रेड कंट्रोल का उपयोग करेंगे)। एक प्रोटोटाइप करने के बाद, इंटरफ़ेस अब तक अच्छी तरह से काम कर रहा है, लेकिन मुझे एक एमवीवीएम प्रोजेक्ट में पूर्ववत/फिर से कार्यक्षमता को कार्यान्वित करने के बारे में सोचने में समस्याएं आ रही हैं। (जैसे एक पाठ बॉक्स के रूप में)एमवीवीएम एप्लिकेशन में पूर्ववत/फिर से कैसे कार्यान्वित करें?

  1. पूर्ववत चालू/फिर से करें, यूआई राज्य, यानी वापसी फोकस, चयन आदि करने के लिए नियंत्रण (रों) बहाल :

    पूर्ववत करें/फिर कार्यक्षमता के लिए है कि परिवर्तन से उत्पन्न हुआ।

  2. आम तौर पर एक पर-व्यू पूर्ववत करें/फिर ढेर

है, मैं आदेश पैटर्न का उपयोग करते हैं, लेकिन मुझे यकीन है कि कैसे MVVM के साथ कि लागू करने के लिए नहीं कर रहा हूँ।

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

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

उत्तर

2

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

सबसे सफल पूर्ववत सिस्टम जिन्हें हमने पहले उपयोग किया है IUndoableCommand ऑब्जेक्ट्स के घोंसले की अनुमति दी है। ये यौगिक आदेश एक एकल उपयोगकर्ता क्रिया में रोल होते हैं (जिस तरह की कार्रवाई आप पूर्ववत मेनू में प्रदर्शन देखने की अपेक्षा करेंगे)।

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

उम्मीद है कि इससे मदद मिलती है।

+0

अब मैं आपके उल्लेख के आधार पर कैल्शियम परियोजना की जांच भी करूँगा। उसके लिए धन्यवाद। –

+0

आपके उत्तर के लिए धन्यवाद, HiTech। जब आप कहते हैं "पूर्ववत केवल व्यक्तिगत नियंत्रण में है" तो क्या आपका मतलब है कि, उदाहरण के लिए, कुछ टेक्स्टबॉक्स के साथ एक फॉर्म (देखें) पर, उपयोगकर्ता को टेक्स्टबॉक्स पर ध्यान देना होगा जहां पूर्ववत/फिर से करने के लिए उसके लिए एक परिवर्तन शुरू हुआ था उस टेक्स्टबॉक्स के माध्यम से उसने कोई बदलाव किया? इंटरफेस से पूरी तरह से कार्यों को अलग करना - इसका मतलब यह नहीं होगा कि दृश्य मॉडल पर दृश्य और गुणों में नियंत्रण के बीच दोवे बाध्यकारी को मना कर दिया जाए? दुर्भाग्यवश, हमारे ऐप में इंटरैक्टिव ड्राइंग सतह (कैनवास) और ब्लेंड/वीएस जैसे फॉर्म दोनों हैं; यह जटिल है। निश्चित रूप से अपने विचारों की सराहना करते हैं! – JamesCo

1

@JamesCo,

मैं पूर्ववत क्रियान्वित किया है/एक WPF आवेदन के लिए फिर से करना और http://muf.codeplex.com/ करने के लिए अपने पूर्ववत करें/फिर कोड प्रकाशित करने समाप्त हो गया। आप इसे NuGet के माध्यम से भी प्राप्त कर सकते हैं। बस "एमयूएफ" या "मॉनीटर अंडो फ्रेमवर्क" की तलाश करें। इसमें सिल्वरलाइट 4.0, साथ ही .NET 3.5, 4.0, और WP7 के लिए समर्थन शामिल है।

मेरा डब्ल्यूपीएफ ऐप भी एमवीवीएम का इस्तेमाल करता है और, कुछ मामलों में, चयन परिवर्तनों जैसी चीजों को पूर्ववत करने की अनुमति देता है।मैंने सक्रिय "पृष्ठ" को भी ट्रैक किया जो कि WPF फ़्रेम में दिखाया गया था ताकि उपयोगकर्ता को उस पृष्ठ पर वापस ले जाया गया जहां पूर्ववत कार्रवाई लागू होनी चाहिए।

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

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

आखिरकार, पुस्तकालय में एक साथ परिवर्तन बैचिंग के लिए समर्थन शामिल है। यह उन समयों में उपयोगी होता है जहां एक इकाई के रूप में कई कार्यों को एक साथ पूर्ववत किया जाना चाहिए।

कोडप्लेक्स साइट (http://muf.codeplex.com/) पर टिप्पणियां और प्रश्नों का स्वागत है। आपको वहां पूर्ण दस्तावेज और नमूना ऐप्स भी मिलेंगे।

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