2011-12-28 17 views
12

मेरे पास मेरे व्यू के पीछे कोड के भीतर एक विधि है (यह विधि मेरे यूआई में कुछ करता है)।व्यूमोडेल से व्यू कोड में एक विधि को कॉल करना?

वैसे भी, मैं इस विधि को अपने व्यूमोडेल से ट्रिगर करना चाहता हूं। यह कैसे किया जा सकता है?

उत्तर

1

MVVM pattern के अनुसार ViewModel को देखने के बारे में पता नहीं है, इसलिए यह स्वीकार्य नहीं है। व्यूमोडेल व्यू के साथ बातचीत करने के लिए एक कमांड ट्रिगर कर सकता है, आप बाइंडिंग का उपयोग भी कर सकते हैं। इसके अलावा, आपको UI-विशिष्ट चीजों को BusyIndicator को ViewModel स्तर पर नहीं ले जाना चाहिए।

कृपया अपने कंक्रीट उपयोग के मामले को और अधिक जानकारी प्रदान करें - जब आप एक व्यू विधि को कॉल करना चाहते हैं और यह विधि क्या करती है।

+0

मेरे यूआई में एक "व्यस्त" सूचक है जिसे केवल कोडबींड के माध्यम से शुरू किया जा सकता है क्योंकि यह उपयोगकर्ता नियंत्रण से लिया गया है जिसमें यह कार्यक्षमता है। इसलिए मुझे इस व्यस्त संकेतक को सेट करने के लिए व्यूमोडेल की आवश्यकता है क्योंकि यह सर्वर – foreyez

+0

से डेटा प्राप्त करने से निपटने वाला है। क्या आप XAML में BusyInduicator घोषित करने और ViewModel गुणों को बाइंडिंग सेट करने का प्रयास कर सकते हैं? व्यूमोडेल को वास्तव में इस सूचक को कैसे सेट करना चाहिए? क्या आप व्यूमोडेल द्वारा बुडी इंडिकेटर प्रारंभिक कोड दिखा सकते हैं? इसके अलावा, आपको UI-विशिष्ट चीजों जैसे BusyIndicator को ViewModel स्तर – sll

0

मैंने देखा कि आप ऊपर दिए गए उत्तर का जवाब दे रहे हैं, आप कह रहे हैं कि आप अपना व्यूमोडेल डेटा पुनर्प्राप्त करना चाहते हैं और फिर व्यस्त संकेतक को रोकने के लिए अपना विचार बताएं।

मुझे यकीन नहीं है कि मेरा समाधान सबसे अच्छा समाधान होगा, लेकिन आप इसे आज़मा सकते हैं, और अगर कोई गलत हो तो कोई भी सही कर सकता है।

तो आपके विचार से, आप डेटासेट पढ़ने शुरू करने के लिए ViewModel से एक विधि कॉल करेंगे, क्या मैं सही हूँ? इस विधि में, आप एक प्रतिनिधि (आपके दृश्य में मौजूद एक विधि को इंगित कर सकते हैं) और जब आपका व्यूमोडेल सर्वर से डेटासेट पढ़ना समाप्त कर देता है, तो प्रतिनिधि को (अपने व्यूमोडेल से) ट्रिगर करें जो आपके दृष्टिकोण से आपकी विधि से जुड़ा हुआ है व्यस्त संकेतक को रोक सकते हैं।

तो अपने ध्यान में रखते हुए आप

void StopBusyIndicator() 
{ 
    this.BusyIndicator.IsBusy = false; 
} 

है और जब आप अपने ViewModel,

इस तरह कॉल इसे कहते डाटासेट पढ़ने के लिए:

ViewModel.ReadDataSet(()= >StopBusyIndicator) 

जो के रूप में StopBusyIndicator विधि पारित करेंगे एक प्रतिनिधि, जिसे आप अपने ReadDataSet के अंत में कॉल कर सकते हैं।

HTH

0

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

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

15

मेरी (और शायद अन्य?) एमवीवीएम के साथ कठिनाई एक साधारण बात को समझना था: व्यूमोडेल के बारे में पता है। मैं बाइंडिंग और कमांड का उपयोग कर रहा था, लेकिन वे xaml में सरल हैं। रन-टाइम पर सुरक्षित समाधान के कारण (सुरक्षित माध्यम आप एक टाइपो कर सकते हैं, लेकिन सॉफ़्टवेयर क्रैश नहीं होगा) यह दृश्य-मॉडल (कम से कम संकलित समय पर) को को कम से कम संकलित करता है। और मैं हमेशा इस decoupling, उदाहरण के लिए, व्यवहार रखने के लिए समाधान की तलाश में था।

सत्य आप मॉडल है, जो आम तौर पर खिड़की के DataContext है देखने के लिए सीधे उपयोग कर सकते हैं, है/उपयोगकर्ता नियंत्रण:

var vm = (MyViewModel)this.DataContext; 

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

// define in the view model 
public delegate void MyEventAction(string someParameter, ...); 
public event MyEventAction MyEvent; 

// rise event when you need to 
MyEvent?.Invoke("123", ...); 

// in the view 
var vm = (MyViewModel)DataContext; 
vm.MyEvent += (someParameter, ...) => ... // do something 
+0

पर स्थानांतरित नहीं करना चाहिए ऐसा लगता है कि वाक्यविन्यास आपके उदाहरण में सही नहीं है। मुझे इसे काम करने के लिए इसे बहुत बदलना है। – Deantwo

+1

@Deantwo, 3 साल पहले मैंने ['EventHandler '] का उपयोग नहीं किया था (https://msdn.microsoft.com/en-us/library/db0etb8x (v = vs.110) .aspx) बहुत, न ही उत्तराधिकारी पैरामीटर के लिए 'EventArgs' से ... पल के लिए स्पष्ट टाइपो को ठीक करना, रिपोर्टिंग के लिए धन्यवाद। – Sinatr

1

आप इसे इस तरह (कोड के पीछे) में कर सकते हैं।

यह व्यूमोडेल द्वारा कार्यान्वित करने के लिए एक इंटरफ़ेस पर चलता है, ताकि आप एक विशिष्ट व्यूमोडेल प्रकार से बाध्य न हों।

// CONSTRUCTOR 
    public SomeView() 
    { 
     InitializeComponent(); 

     DataContextChanged += DataContextChangedHandler; 
    } 

    void DataContextChangedHandler(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     var viewModel = e.NewValue as IInterfaceToBeImplementedByViewModel; 

     if (viewModel != null) 
     { 
      viewModel.SomeEvent += (sender, args) => { someMethod(); } 
     } 
    } 
संबंधित मुद्दे