2009-08-10 19 views
6

में एमवीवीएम (आईसीओएमएंड) कृपया, अगर इस प्रश्न पर पहले से या परोक्ष रूप से बड़े पास के प्रिज्म और एमवीवीएम ब्लॉगों में उत्तर दिया गया तो सख्ती से फैसला न करें। RelayCommand या DelegateCommand वर्गों के WPF कार्यान्वयन में एक ऐसी eventhandlerसिल्वरलाइट

/// <summary> 
/// Occurs whenever the state of the application changes such that the result 
/// of a call to <see cref="CanExecute"/> may return a different value. 
/// </summary> 
public event EventHandler CanExecuteChanged 
{ 
    add { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 
} 

नहीं है लेकिन नामस्थान की SL सबसेट में कोई CommandManager वर्ग नहीं है। और यह वह जगह है जहां मैं फंस गया हूँ। मुझे अभी तक एसएल के लिए एमवीवीएम गोद लेने में इसके लिए कोई समाधान नहीं मिला है (PRISM अभी तक मेरे लिए इतना जटिल है)। अलग-अलग सरल HelloWorldMVVM ऐप्स बिल्कुल निपट नहीं पाते हैं।

अग्रिम और मेरे अंग्रेजी के लिए खेद है धन्यवाद -)

उत्तर

5

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

एक अन्य पहलू जिसे आप संभालना होगा, दृश्य-मॉडल में परिवर्तन के दौरान दृश्य को संशोधित करना है। विशेष रूप से आप व्यू-मॉडल की स्थिति के आधार पर नियंत्रण सक्षम और अक्षम करना चाहते हैं। इसे प्राप्त करने के लिए आपको दृश्य-मॉडल में कुछ नियंत्रण के लिए IsEnabled संपत्ति को बांधना होगा जो दर्शाता है कि एक निश्चित ऑपरेशन की अनुमति है या नहीं। कस्टम IValueConverter ऑब्जेक्ट्स को कार्यान्वित करना जो बूलियन मानों में परिवर्तित होते हैं अक्सर उपयोगी होते हैं। उदाहरण के लिए, यदि आपके व्यू-मॉडल में ऐसी संपत्ति है जो गिनती का प्रतिनिधित्व करती है और आप दृश्य में एक विशेष नियंत्रण चाहते हैं तो केवल शून्य होने से अधिक सक्षम होने पर आप एक वैल्यू कनवर्टर बना सकते हैं जो true में परिवर्तित हो जाता है जब संख्या अधिक होती है शून्य से और बाध्यकारी में इस मान कनवर्टर का उपयोग करें।

यदि आप किसी एमवीवीएम एप्लिकेशन के डब्ल्यूपीएफ उदाहरण को अनुकूलित करने का प्रयास करते हैं तो आपको कमांड के सभी उपयोगों से छुटकारा पाना होगा और अपना कोड बदलना होगा। आपके उदाहरण में कोड Silverligt में सार्थक नहीं है, लेकिन डब्ल्यूपीएफ में यह निर्धारित करने की प्रक्रिया में शामिल है कि दृश्य में नियंत्रण सक्षम है, दृश्यमान आदि

+0

मुझे लगता है कि आप थोड़ा गलत हैं - सिल्वरलाइट 2 –

+1

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

+0

धन्यवाद। मैंने सोचा कि आईसीओएमएंड उपस्थिति का मतलब पूर्ण कमांडिंग समर्थन है, इसलिए मैं गलत था - (इसलिए, यह पता चला है कि एसएल में एमवीवीएम कार्यान्वयन इतना आसान नहीं है, जैसा कि डब्ल्यूपीएफ में है। मुझे अभी तक केवल एक ही रास्ता मिला है - संलग्न संपत्तियों और व्यवहारों का उपयोग करना यह: http://blogs.southworks.net/jdominguez/2008/08/icommand-for-silverlight-with-attached-behaviors/ या तैयार ढांचे का उपयोग करते हुए, जहां कई घटनाएं http: // nroute को गले लगाती हैं। codeplex.com –

5

सिल्वरलाइट 4.0 आईसीओएमएंड इंटरफेस का समर्थन करता है और इस प्रकार एक डब्ल्यूपीएफ प्रदान करेगा कमांडिंग इंफ्रास्ट्रक्चर की तरह।