मैं WPF और MVVM समस्या सीखने की कोशिश कर रहा हूं, लेकिन एक रोड़ा मारा है। यह प्रश्न समान है लेकिन यह एक जैसा नहीं है (हैंडलिंग-डायलॉग-इन- wpf-with-mvvm ...
मेरे पास MVVM पैटर्न का उपयोग करके एक "लॉगिन" फ़ॉर्म है।
इस फ़ॉर्म में एक ViewModel है, जो उपयोगकर्ता नाम और पासवर्ड रखता है, जो सामान्य डेटा बाइंडिंग का उपयोग करके XAML में दृश्य के लिए बाध्य हैं। इसमें एक "लॉगिन" कमांड भी है जो फॉर्म पर "लॉगिन" बटन से बंधा है, सामान्य डेटाबाइंडिंग का उपयोग करके अगैन।
जब "लॉगिन" कमांड फायर करता है, तो यह ViewModel में एक फ़ंक्शन को आमंत्रित करता है जो बंद हो जाता है और लॉग इन करने के लिए नेटवर्क पर डेटा भेजता है। जब यह फ़ंक्शन पूरा हो जाता है, तो 2 क्रियाएं होती हैं:
लॉगिन अमान्य था - हम सिर्फ एक संदेश बॉक्स दिखाते हैं और सब ठीक है
लॉगिन मान्य था, हमें लॉगिन फ़ॉर्म को बंद करने की आवश्यकता है और क्या यह उसके रूप में सही है
DialogResult...
समस्या यह है कि, ViewModel को वास्तविक दृश्य के बारे में कुछ भी नहीं पता है, इसलिए यह दृश्य को कैसे बंद कर सकता है और किसी विशेष डायलॉगResult को वापस करने के लिए कह सकता है ?? मैं कोड कोड में कुछ कोड चिपका सकता था, और / या ViewModel के माध्यम से दृश्य पास कर सकता था, लेकिन ऐसा लगता है कि यह पूरी तरह से MVVM के पूरे बिंदु को हरा देगा ...
अपडेट करें
अंत में मैंने एमवीवीएम पैटर्न की "शुद्धता" का उल्लंघन किया और व्यू को एक Closedघटना प्रकाशित किया, और एक Closeविधि का पर्दाफाश किया । ViewModel तो बस फोन होगा view.Close। दृश्य केवल एक इंटरफेस के माध्यम से जाना जाता है और एक आईओसी कंटेनर के माध्यम से वायर्ड किया जाता है, इसलिए कोई परीक्षण या स्थिरता नहीं खो जाती है।
यह मूर्खतापूर्ण लगता है कि स्वीकृत उत्तर -5 मतों पर है! जब मैं अच्छी भावनाओं के बारे में अच्छी तरह से जानता हूं कि किसी को "शुद्ध" होने के दौरान एक समस्या को हल करने से मिलता है, तो निश्चित रूप से मैं केवल एक ही नहीं हूं जो सोचता है कि घटनाओं, आदेशों और व्यवहारों की 200 लाइनें सिर्फ एक लाइन पद्धति से बचने के लिए "पैटर्न" और "पवित्रता" का नाम थोड़ा हास्यास्पद है ...।
Closeतरीका अभी भी सबसे अच्छा समाधान है। अन्य अधिक जटिल संवादों पर सब कुछ MVVM और डेटाबाउंड है, लेकिन यह सिर्फ एक सरल विधि के बजाय विशाल "समाधान" को लागू करने के लिए मूर्खतापूर्ण लग रहा था ...