2010-09-13 17 views
8

में UserControl की विधि को कॉल करना मुझे UserControl पर एक विधि कॉल करने में कोई समस्या है। मुझे जाना सुनें:एमवीवीएम

  1. मैं SomeView.xaml

    में
  2. एक UserControl someControl है SomeView.xaml के DataContext SomeViewModel.cs

  3. मैं someControl.DoStuff() किसी भी तरह कॉल करने के लिए, कहीं सक्षम होने के लिए चाहते हैं।

  4. DoStuff नहीं यूआई विशिष्ट (मैं सिर्फ DoStuff SomeView.Xaml.Cs का कोड-पीछे से अगर यह यूआई विशिष्ट था बुलाया सकता है, लेकिन इस मामले में, यह नहीं हो सकता।) है

कोई विचार?

धन्यवाद!

उत्तर

5

शायद आपको उत्तर पसंद नहीं है, लेकिन आपके ViewModel को आपके यूआई का कोई ज्ञान नहीं होना चाहिए। अगर आपके पास UserControl पर एक गैर-UI विधि है, तो शायद यह गलत जगह पर है।

एकमात्र चीज जो मैं सोच सकता था वह यह है कि आप कुछ प्रकार के मैसेजिंग को लागू करना चाहते हैं (जैसे उनके पास MVVM Light है) जो निष्पादन को ट्रिगर कर सकता है।

यह या तो है, या पुनर्विचार करें कि आपने अपना कोड कैसे आर्किटेक्ट किया है।

+0

मैं समझता हूं कि आप कहां से आ रहे हैं और मुझ पर विश्वास करते हैं, मैंने इस बारे में सोचा है। लेकिन ऐसा समय आता है जहां आपको वास्तव में एक विधि कॉल करने की आवश्यकता होती है। उदाहरण के लिए, उपयोगकर्ता नियंत्रण पर विधि का खुलासा किया जा सकता है और मेरे पास उपयोगकर्ता नियंत्रण का स्रोत नहीं हो सकता है, इसलिए मैं इसे अपने मामले को समायोजित करने के लिए संशोधित नहीं कर सकता। सुझाव के लिए –

+0

+1 हालांकि, आप सही हैं, ViewModel को दृश्य का ज्ञान नहीं होना चाहिए। –

+0

उस स्थिति में, कोडबेंड पर जाएं, हो सकता है? – Robaticus

0

एमवीवीएम डिज़ाइन में, विचार आमतौर पर आपके उपयोगकर्ता नियंत्रण (xaml.cs फ़ाइल) में एक कोड नहीं है (एक आदर्श दुनिया में)। यूआई और व्यूमोडेल के बीच सभी बातचीत को कमांड और बाइंडिंग के माध्यम से संभाला जाना चाहिए ... तो आपको अपने उपयोगकर्ता नियंत्रण में DoStuff की आवश्यकता क्यों है?

आप

<Button Command="{Binding myCommandOnTheDataContextViewModel}" Content="{Binding somePropertyOnTheViewModel}" /> 
3

ऐसा लगता है जैसे आप DoStuff अपने वीएम में कुछ डेटा या तर्क के जवाब में क्या करना चाहते की तरह कुछ है, जो मामले में साफ विधि शायद एक घटना में होने वाले उपयोग करने के लिए किया जाएगा हो सकता है आपका वीएम और DoStuff द्वारा संभाला। यदि ट्रिगर राज्य परिवर्तन की तरह अधिक है तो आप उचित उपयोगकर्ता डेटा को अपने उपयोगकर्ता नियंत्रण पर एक नई निर्भरता संपत्ति में बाध्य कर सकते हैं और डीपी के परिवर्तन हैंडलर से DoStuff को कॉल कर सकते हैं।

0

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

0

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

0

यदि विधि DoStuff(); कुछ यूआई विशिष्ट तर्क करता है तो विधि सही जगह पर है। जब नहीं तो यह किसी अन्य वस्तु में होना चाहिए (उदा। कुछ दृश्य दृश्य)।

कुछ दृश्य दृश्य को कुछ दृश्यों पर एक विधि को कॉल करने की अनुमति है जब इसे किसी इंटरफ़ेस के माध्यम से अलग किया जाता है। यह कैसे पूरा किया जा सकता है WPF Application Framework (WAF) द्वारा दिखाया गया है।

1

एक एसओ द्वारा हासिल इस को जवाब ViewModel के ज्ञान के बारे में अलग करता देखें कार्रवाई प्रतिनिधियों जवाब का उपयोग करके Merthere

यहाँ अपने कोड चिपकाया गया द्वारा है, यदि कोई संयोग से लिंक टूट जाता है।

class MyCodeBehind 
{ 
    public MyCodeBehind() 
    { 
     Action action = new Action(()=> this.SomeMethodIWantToCall()); 
     var myVM = new MyVM(action); // This is your ViewModel 
     this.DataContext = myVM; 
    } 

    private void SomeMethodIWantToCall(){...} 
} 

class MyVM 
{ 
    private Action action; 

    public MyVM(Action someAction) 
    { 
     this.action = someAction; 
    } 

    private void SomeMethodInVM() 
    { 
     this.action(); // Calls the method SomeMethodIWantToCall() in your code behind 
    } 
}