2008-11-24 11 views
7

मैं डब्ल्यूपीएफ में एमवीपी/एम-वी-वीएम लागू कर रहा हूं और मुझे अब तक इसके साथ शुभकामनाएं मिल रही हैं। हालांकि, मुझे नहीं लगता कि यह मॉडल मॉडल संवाद बॉक्स को कार्यान्वित करने का समर्थन करता है। मैंने यह काम सीखने के लिए क्रैक.NET (http://www.codeplex.com/cracknetproject) से अपना काम लिया है।मॉडल-व्यू-प्रस्तुतकर्ता और मॉडल संवाद बॉक्स .... कैसे करें?

मेरे पास एक शैल व्यू व्यू (जो सिर्फ एक्सएएमएल है) जिसमें इसका मेनू है। मेन्यू शेलमोडेल व्यू में एक कमांड से जुड़ा हुआ है जो "एडिट प्रेफरेंस" कहता है।

शैलमोडेल व्यू संपादनप्रणाली के लिए आईसीओएमएंड लागू करता है और यहां हम उपयोगकर्ता को एप्लिकेशन के लिए वरीयताओं को संपादित करने के लिए एक संवाद बॉक्स रखना चाहते हैं।

यहां कई समस्याएं: 1. शैलमोडेल व्यू में शैल व्यू का संदर्भ सही ढंग से संवाद करने के लिए नहीं है। ShellModelView ShellView का DataContext है, लेकिन मुझे सेटअप की बैकरेफर दिखाई नहीं दे रही है। 2. ShellModelView को वैसे भी स्पष्ट यूआई लोड नहीं किया जाना चाहिए। तो यहां उचित इंटरैक्शन मॉडल क्या है? 3. मैं अपनी प्राथमिकताएं डायलॉग कैसे बना सकता हूं ताकि यह तर्क और दृश्य के बीच ठीक से अलग हो सके? PreferencesDialog को खुद को एक विंडो होने की आवश्यकता है ताकि आप उस पर ShowDialog को कॉल कर सकें, लेकिन इसका मतलब है कि आपको इसे तुरंत चालू करने के लिए विंडो (उदा। देखें) के संदर्भ की आवश्यकता है। आदर्श रूप से मैं दृश्य को तत्काल किए बिना प्राथमिकता डायलॉग के भीतर कोड/सत्यापन का परीक्षण करने में सक्षम होना चाहिए (शायद एक मॉक व्यू का उपयोग कर?)।

उत्तर

1

आपको अपने मामले में एक नियंत्रक की आवश्यकता होगी। वरीयता संवाद विंडो दिखाने के लिए नियंत्रक प्रभारी होना चाहिए।

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

यदि आप पहले से ही ऐसा नहीं कर चुके हैं तो आप Prism में समान पैटर्न पा सकते हैं। आप वहां दिए गए प्रतिनिधिमंडल का पुन: उपयोग भी कर सकते हैं :)

6

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

यहाँ ताकि पर एक समान सवाल यह है कि मूल रूप से एक ही बात कहते हैं: M-V-VM Design Question. Calling View from ViewModel

1

PreferencesDialog एक अंतरफलक है कि EditPreference आदेश के गुणों में से एक है लागू है। आदेश इंटरफ़ेस के माध्यम से संवाद के साथ बातचीत करेगा। यूनिट परीक्षण के लिए नकली वस्तु इसके बजाय इंटरफेस को लागू करेगी।

संवाद वर्ग तब आपकी उच्चतम परत पर रह सकता है।

+1

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

+0

ऐसा इसलिए नहीं है क्योंकि इंटरफ़ेस संवाद के कार्यान्वयन से कमांड को इन्सुलेट करता है। –

+0

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

0

मेरे 2 सेंट है:

  1. आदेश पैरामीटर के रूप में viewfactory अनुबंध किसी तरह का दर्रा या दृश्य मॉडल में एक viewfactory अनुबंध इंजेक्षन।व्यू मॉडल वे व्यूफैक्टरी का उपयोग किसी भी मोडल/गैर मोडल दृश्यों को बनाने के लिए करेंगे। व्यूफैक्टरी अपने शो/शोमोडाल विधि के पैरामीटर के रूप में भी प्रदर्शित करने के लिए एक व्यूमोडेल ले सकता है। इसके अलावा, व्यूफैक्टरी एक पैरामीटर के रूप में पारित किसी भी व्यूमोडल को प्रदर्शित करने के लिए डेटामैप्लेट का उपयोग कर सकता है।

  2. प्रश्न में व्यूमोडेल में ShowViewModel प्रॉपर्टी जोड़ें। एक DataTrigger तो इस संपत्ति के लिए देख सकते हैं और जब यह एक विशेष प्रकार का है देखने के लिए, आदि

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