2009-12-05 14 views
5

मैं एमवीवीएम पैटर्न सीखने की कोशिश कर रहा हूं। मेरी मुख्य समस्या यह है कि मुझे सीखना चाहिए कि मुझे कहां घोषित किया जाना चाहिए, कमांड ऑब्जेक्ट्स बनाना और बाध्य करना चाहिए।एमवीवीएम कमांड बाइंडिंग

2 उदाहरण:

  1. मैं एक मुख्य रूप है कि एक स्विच बोर्ड या मुख्य मेनू की तरह काम करता है। सेल्ट बटन 1 और व्यू 1 प्रदर्शित होता है, बटन 2 का चयन करें और देखें 2 प्रदर्शित होता है। महान। अब मैं मुख्य रूप में वापस जाना चाहता हूं इसलिए मुझे "मुख्य मेनू" नामक व्यू 1 (और देखें 2) पर एक बटन चाहिए। मुझे कमांड और कमांड हैंडलर को कहां परिभाषित करना चाहिए ताकि मैं "ShowMainMenu" कमांड से जुड़ सकूं? मैं उन्हें View2ViewModel में बना सकता हूं लेकिन तब मुझे मुख्य दृश्य दिखाने के लिए उपयोग नहीं है? या, मैं मेनव्यू मॉडल में थिम बना सकता हूं लेकिन फिर मैं उन्हें बच्चों के दृश्य मॉडल में कैसे बांधूं (मैं एमवीवीएम सिफारिश के अनुसार रिलेकॉमैंड ओबेजेक्ट का उपयोग कर रहा हूं और वे माता-पिता को बुलबुला नहीं करते हैं।)

  2. मेरे पास एक मुख्य विंडो दृश्य पर दिखाई देने वाले दो उपयोगकर्ता नियंत्रण हैं, चलिए उन्हें मेनव्यू, यूसी 1 और यूसी 2 कहते हैं। इनमें से प्रत्येक में ViewModel MainViewModel, UC1ViewModel, UC2View मॉडल है। मेरे पास "AddItem" नामक यूसी 1 पर एक बटन है। इसे यूसी 2 पर एक सूची में एक आइटम जोड़ना चाहिए। "AddItemCommand" सेट करने और इसे बांधने का सही तरीका क्या है। क्या कमांड MainViewModel, Uc1ViewModel या UC2ViewModel में होना चाहिए? और मैं कितना जोर से बांधता हूं।

आपकी सहायता के लिए धन्यवाद।

उत्तर

3

1) आप एक आधार ViewModel से View1Model और View2Model का उत्तराधिकारी प्राप्त कर सकते हैं और ShowMainMenu को परिभाषित कर सकते हैं।

या (यह मेरा तरीका है)

ContentPresenter साथ RootView जो अपने विचारों के सभी दिखाएगा बनाएँ। संपत्ति ViewContent के साथ RootVeiwModel बनाएँ। RootViewModel की सामग्री सामग्री देखने के लिए ContetnPresenter की बाध्य सामग्री गुण। आप object का उपयोग व्यूकंटेंट के प्रकार के रूप में कर सकते हैं, लेकिन मैं आपको सलाह देता हूं कि आप इंटरफ़ेस को परिभाषित करें जो MainVView1Model, View1Model और View2Model द्वारा समर्थित है। ViewContent को बदलने से ProprtyChangedEvent को बढ़ाया जाना चाहिए। रूटव्यूमोडेल में ShowMainViewCommand को परिभाषित करें जो केवल व्यूकंटेंट को मेनव्यूमोडेल में बदल देगा (और यह मेनव्यू के रूप में दिखाया जाएगा)।

RootView:

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type RootView}}, 
         Path=DataContext.ShowMainViwe} 

वहाँ मैं क्या कहने की कोशिश कर रहा हूँ समझाने के लिए कुछ कोड है: फिर, कि जिस तरह से है कि आदेश को View1 और View2 में बटन की कमान संपत्ति बाँध exmple के लिए।XAML

... 
<ContentPresenter Content={Binding ViewContent} /> 
... 

RootViewModel.ca

class RootViewModel : INotifyPropertyCahnged 
{ 
    ... 
    private object _ViewContent; 
    public object ViewContent 
    { 
     get {return _ViewContent;} 
     set 
     { 
      _ViewContent = value; 
      if (PropertyChanged != null) 
      { 
       PropertyChanged ("ViewContent"); 
      } 

     } 
    } 

    private RelayCommand _ShowMainView; 
    public ICommand ShowMainView 
    { 
     get 
     { 
      if (_ShowMainView == null) 
      { 
       _ShowMainView = new RelayCommand(x => ViewContent = new MainViewModel()); 
      } 
      return _ShowMainView; 
     } 
    } 
    ... 
} 

2) UC1ViewModel और UC2ViewModel को MainViewModel के संदर्भ जोड़ें - जिस तरह से अन्य नियंत्रण को प्रभावित करने की thats। MainViwModel में गुण होना चाहिए जिसमें UC1ViewModel और UC2ViewModel दूसरे उपयोगकर्ता नियंत्रण के आइटम अवलोकननीय कोलेक्शन में निहित होना चाहिए।

यह कैसे कोड से काम करता है मैं सिर्फ तुम्हें दिखाता हूँ:

class UC1ViewModel : INotifyPropertyChanged 
{ 
    ... 
    private MainViewModel _Parent; 
    public UC1ViewModel(MainViewModel parent) 
    { 
     _Panert = parent; 
    } 

    private RelayCommand _AddItemToUC2; 
    public ICommand AddItemToUC2 
    { 
     get 
     { 
      if (_AddItemToUC2 = null) 
      { 
       // UC2Content is UC2ViewModel 
       // Items is ObservableCollection 
       _AddItemToUC2 = new RelayCommand(x => _Parent.UC2Content.Items.Add(...)); 
      } 
      return AddItemToUC2; 
     } 
    } 
    ... 
} 
+0

पहले उदाहरण के में आप सेट ViewContent = नए MainViewModel()); क्या यह एक विंडो/उपयोगकर्ता नियंत्रण होना चाहिए? या क्या आप वास्तव में वर्तमान सामग्री को एक दृश्य मॉडल में सेट करते हैं? – thrag

+0

यह मॉडल देखें। यदि आप अपने विचार में ContentPresenter रखते हैं और ViewModel पर सामग्री प्रॉपर्टी को बाध्य करते हैं तो इसे संबंधित दृश्य के रूप में दिखाया जाएगा। क्या आप इस तरह व्यू-व्यूमोडेल एसोसिएशन का उपयोग करते हैं: <देखें: मुख्य दृश्य /> bniwredyc

2

मेनमोडेल में प्रत्येक UCxViewModel या आसान, ViewModels की एक सूची के लिए एक संपत्ति हो सकती है। "शो" कमांड एक संबंधित UVxViewModel बनाएगा, UVxViewModel द्वारा प्रकाशित "ऑनक्लोज़" ईवेंट की सदस्यता लें, और इसे सूची में जोड़ें। मेनव्यू में इस सूची के लिए एक नियंत्रण (उदाहरण के लिए टैब नियंत्रण) है और प्रत्येक UCxViewModel के लिए उपयोग किए जाने वाले दृश्यों को परिभाषित करने वाले डेटा टेम्पलेट्स हैं। जब UVxViewModel अपने ऑनक्लोज़ ईवेंट को सक्रिय करता है, तो मेनमोडेल इसे सूची से हटा देता है, जिससे संबंधित दृश्य "बंद" हो जाता है।

"आइटम जोड़ें" भाग के लिए, ViewModels आइटम (मॉडल) की एक ही सूची साझा करना चाहिए। UC2ViewModel तब एक आइटम जोड़ सकता है और UC1View अपडेट हो जाएगा (बशर्ते सूची लागू करें IotifyCollectionChanged लागू करें)।

मुझे this explanation एमवीवीएम को समझने में बहुत उपयोगी पाया गया।

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