2010-06-03 11 views
9

पर ईवेंट इवेंट और प्रेषक पास करना रिलेकॉमैंड का उपयोग करते समय आप ईवेंट प्रेषक कैसे प्राप्त करते हैं?रिलेकॉमैंड

उत्तर

15

यह उन दर्द-इन-द-% ¤ # उत्तरों में से एक है जहां मैं वास्तव में आपके प्रश्न का उत्तर नहीं देता हूं, बल्कि इसके बजाय आपको व्याख्यान देता हूं कि आपको अलग-अलग क्या करना चाहिए। उस बात से बहुत दुखी हूं। यहां जाता है:

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

+0

बस के रूप में वी एम visibilty जोखिम नहीं होगा (और बदले XAML में एक कनवर्टर का उपयोग करें), शायद वहाँ किसी तरह दूसरे रास्ते जाने के लिए एक कनवर्टर का उपयोग करने के लिए ... एक दृश्य आधारित eventarg से परिवर्तित किया जाना चाहिए एक गैर-दृश्य प्रकार में? –

+0

आपका सुझाव एमवीवीएम नियमों को तोड़ने का तरीका कैसा है? मुझे ठीक लगता है। –

+0

मुझे लगता है कि उस समय मेरी मुख्य समस्या यह थी कि वीएम में कमांड को बटन (दृश्य में) को बाध्य करने की तुलना में यह अत्यधिक जटिल है। अब इसे देखकर, मुझे लगता है कि आप सही हैं। यह वास्तव में किसी भी नियम तोड़ नहीं है। –

9

मुझे एक ही समस्या थी, लेकिन केवल EventArgs प्राप्त करने की आवश्यकता थी। खुशी से, स्टैक ओवरफ्लो में यहां एक और धागे में जवाब मिलने के बाद यह बेहद सरल था।

<cmd:EventToCommand Command="{Binding SomeCommand, Mode=OneWay}" PassEventArgsToCommand="True"/> 

एक बार जब आप उस जादू "PassEventArgsToCommand" सेटिंग के बारे में जानते हैं, तो आप सुनहरे हैं। सादा रिलेकॉमैंड के बजाय बस RelayCommand<type> का उपयोग करें।

मुझे आशा है कि इस मदद करता है।

+5

बस उस पर टिप्पणी करना चाहते हैं: PassEventArgsToCommand बहुत साफ नहीं है, क्योंकि यह वीआई में यूआई क्लास (EventArgs) लाकर चिंताओं को अलग करता है। इसका उपयोग करने से आपका वीएम कम टेस्टेबल हो जाता है। हालांकि परिदृश्य हैं (उदाहरण के लिए ड्रैग और ड्रॉप) जहां कहीं और भी गंदे होंगे। यही कारण है कि मैंने इसे EventToCommand में जोड़ा। हालांकि बहुत सारी देखभाल के साथ प्रयोग करें! – LBugnion

+2

हालांकि PassEventArgsToCommand साफ़ नहीं हो सकता है, मुझे अपने WP7 ऐप में SkyDrive समर्थन जोड़ने का प्रयास करने में उपयोगी लगता है। साइनइन बटन घटना तर्क के माध्यम से लाइव सत्र जानकारी पास करता है। मैं शायद कोड को पीछे-पीछे संभाल सकता हूं, सत्र संपत्ति को ViewModel पर सेट कर सकता हूं और फिर कमांड का आह्वान कर सकता हूं। PassEventArgsToCommand समझने योग्य कोड लिखने में मदद करता है। – rams

5

यह प्रेषक को कमांड पैरामीटर पर बाध्य करके किया जा सकता है।

<command:EventToCommand 
       Command="{Binding CommandName}" 
       CommandParameter="{Binding RelativeSource= 
             { RelativeSource FindAncestor, 
              AncestorType={x:Type TypeOfSender}, 
              AncestorLevel=1}}" 
       PassEventArgsToCommand="True" > 
</command:EventToCommand> 
+1

मैंने इसे ऊपर उठाया क्योंकि हेनरिक यह समझाते हुए सही है कि यह नहीं किया जाना चाहिए, दुनिया सही नहीं है और शुद्ध एमवीवीएम प्राप्त करना कभी-कभी असंभव होता है। उदाहरण के लिए, यदि आप फोकस प्राप्त करते समय सभी टेक्स्ट का चयन करने के लिए टेक्स्टबॉक्स चाहते हैं, तो आपको अपने SelectAll() सदस्य को कॉल करने के लिए टेक्स्टबॉक्स की आवश्यकता होगी। यह निस्संदेह एमवीवीएम में करने योग्य है लेकिन यह बेहद जटिल कोड बनाएगा, जबकि यह समाधान कुछ स्थितियों में "पर्याप्त पर्याप्त" है। मैं मानता हूं कि इस व्यवहार को जितना संभव हो उतना निराश किया जाना चाहिए, लेकिन कभी-कभी आपको व्यावहारिक और इस तरह का एक फिक्स होना चाहिए, जबकि बदसूरत, काम करता है। – Bas

+2

एक और उदाहरण: डब्ल्यूपीएफ वेब ब्राउजर नियंत्रण। आप नेविगेटेड ईवेंट को कमांड बाध्य कर सकते हैं, लेकिन यदि आप वास्तव में http प्रतिक्रिया के साथ कुछ करना चाहते हैं, तो आपको ब्राउज़र के संदर्भ की आवश्यकता है, क्योंकि वह जानकारी घटनाओं में नहीं है। – Bas

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