2010-10-31 13 views
5

मैं एमवीवीएम के लिए कुछ नया हूं। मुझे यकीन नहीं है कि मैं जो करने की कोशिश कर रहा हूं वह करने का सबसे अच्छा तरीका क्या है। मैं एक वीएम कि अन्य विंडो दिखाने के लिए जा रहा हैमौजूदा दृश्य मॉडल से दृश्य मॉडल तक पहुंचने का सही तरीका

:

यहाँ परिदृश्य है। मैं myNewWindowView.Show() पर कॉल कर सकता हूं, लेकिन पहले मुझे अपनी नई विंडो के वीएम में कुछ डेटा सेट करने की आवश्यकता है।

क्या मुझे myNewWindowView और NewWindowViewModel दोनों कॉलिंग व्यूमोडेल को बेनकाब करना चाहिए?

class MainVM 
{ 
    public void FindCustomer(string nameParial) 
    { 
     List<Customer> customers = ServiceCall.GetCustomers(nameParital); 
     // This is the part I am not sure how to do. I am not sure if this 
     // View Model should have a reference to a different view model and 
     // the view too. 
     myNewWindowViewModel.CustomerList = customers; 
     myNewWindowView.Show(); 
    } 
} 

उत्तर

3

मैं viewmodel किसी भी दृश्य से अलग रखना होगा:

यहाँ एक उदाहरण है। मैं उनके बारे में परतों के रूप में सोचता हूं, लेकिन वे केवल एक दिशा में अदला-बदले होते हैं।

तो प्रकार के फू के मॉडल के शीर्ष पर कोई भी दृश्य मॉडल हो सकता है, और यह कभी भी दृश्यमान प्रकार की अपेक्षा या परवाह नहीं करता है।

एक व्यूमोडेल केवल एक प्रकार के मॉडल के लिए हो सकता है, लेकिन यह परवाह नहीं करता है या उम्मीद नहीं करता कि किस प्रकार का दृश्य इसका उपयोग करेगा।

एक दृश्य किसी विशेष प्रकार के व्यूमोडेल के लिए होगा।

जो प्रतीत होता है वह एक व्यूमोडेल है जो इस विचार की परवाह करता है कि कौन से विचार कर रहे हैं, जो मेरे लिए गलत लगता है।

यदि यह मैं था, तो मुझे मुख्य विंडो के लिए नई विंडो प्रदर्शित करने के लिए मुख्य दृश्य प्राप्त करने के लिए मुख्य विंडो प्राप्त करने के लिए मुख्य दृश्य प्राप्त करने के लिए मुख्य दृश्य प्राप्त होगा।

इस कोड मैं मुख्य viewmodel

class MainWindow : Window 
{ 
    public MainWindow() 
    { 
      Initialize(); 
      DataContext = new MainVM(); 
    } 

    public void FindCustomerClick(object sender, RoutedEventArgs args) 
    { 
      CustomerListView clv = new CustomerListView(); 
      clv.DataContext = (DataContext as MainVM).FindCustomer(search.Text); 
      clv.Show(); 
    } 
} 

आप देख सकते हैं के लिए दृश्य के पीछे डाल दिया जाएगा, viewmodel एक विधि है कि एक स्ट्रिंग लेता है और रिटर्न एक CustomerListViewModel है, जो तब के लिए लागू किया जाता है एक ग्राहक सूची दृश्य का DataContext।

+0

अच्छा लगता है, लेकिन यह भी अस्पष्ट लगता है। क्या आप मुझे एक उदाहरण दिखा सकते हैं कि आप मेरा उदाहरण सही तरीके से कैसे करेंगे? (मेरे पास एक खिड़की है जो उनके बीच कुछ डेटा पास हो गई है।) – Vaccano

+0

मैं कोशिश करूंगा। मुझे शायद इसे बाद में ठीक करना होगा, क्योंकि मैं इसे अपने फोन से कर रहा हूं :) –

+0

यह अच्छा लगता है कि मेरा 'ग्राहकसूची दृश्य। डेटा कॉन्टेक्स्ट' मेरे 'ग्राहक सूची दृश्य मॉडल' पर सेट है। अगर मैं 'FindCustomer' के परिणाम पर सेट करता हूं तो मैं उस दृश्य के लिए एमवीवीएम सेटअप खो देता हूं। – Vaccano

2

अपने दृश्य मॉडल के अंदर विचारों को संदर्भित न करें। विचारों को दृश्य बनाते हैं और मॉडल को दृश्य मॉडल बनाते हैं।

चिंताओं के इस अलगाव को पूरा करने का एक आसान तरीका घटनाओं के साथ है। त्वरित और गंदी तरह से यह करने के लिए अपने माता पिता को देखने के मॉडल पर एक ChildViewModel संपत्ति बनाते हैं और फिर ध्यान में रखते हुए PropertyChanged को संभालने के लिए, है जैसे:

ParentViewModel vm = (ParentViewModel)DataContext; 
vm.PropertyChanged += delegate(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "ChildViewModel") 
    { 
     MyChildWindow w = new MyChildWindow(); 
     w.Show(vm.ChildViewModel); 
    } 
}; 

अब हर बार जनक दृश्य मॉडल में परिवर्तन ChildViewModel संपत्ति, अभिभावक दृश्य एक नया बच्चा दृश्य खुल जाएगा।

एक कम त्वरित, और कम गंदा, दृष्टिकोण एक CreateViewEventHandler प्रतिनिधि और CreateViewEventArgs वर्ग बनाते हैं, और ईवेंट हैंडलर बनाने के लिए है, और एक संरक्षित OnCreateView विधि, अपने आधार दृश्य मॉडल वर्ग का हिस्सा (यह मानते हुए आपके पास है)। इससे दृश्य मॉडल को एक और अधिक स्पष्ट होने की अनुमति मिलती है जब एक बच्चे की खिड़की बनाई जानी चाहिए।

ध्यान दें कि यदि माता-पिता दृश्य मॉडल के लिए यह जानना महत्वपूर्ण है कि बच्चे के मॉडल को बंद कर दिया गया है, तो बच्चे का दृश्य मॉडल उस घटना का पर्दाफाश कर सकता है जिस पर माता-पिता सदस्यता ले सकते हैं (या फिर, एक संपत्ति का उपयोग करें और PropertyChanged ईवेंट)।

ध्यान दें कि दोनों मामलों में, आप इकाई परीक्षण लिख सकते हैं जो सत्यापित करता है कि दृश्य मॉडल खिड़की खोलता है (यानी घटना को उठाता है) जब इसे विचारों को शामिल किए बिना माना जाता है।

मैंने स्वयं किसी भी एमवीवीएम फ्रेमवर्क का उपयोग नहीं किया है, लेकिन जिन लोगों को मैंने देखा है वे मैसेजिंग टूल्स हैं जो इस तरह की चीज़ों को सुविधाजनक बनाने के लिए डिज़ाइन किए गए हैं।

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