2010-07-29 12 views
5

यह प्रश्न this older एक का अनुवर्ती है, और यह एक खुले प्रश्न की तुलना में अधिक पुष्टि है।एक पदानुक्रमित डेटा संरचना में एमवीवीएम में संपादन जोड़ें

मेरा व्यू मॉडेल उदाहरण मॉडल का एक निजी उदाहरण है, _modelInst
व्यूमोडेल के संपादन के दौरान मॉडल के डेटा तक विशेष पहुंच है (इसलिए मॉडल को INotifyPropertyChanged को लागू करने की आवश्यकता नहीं है)।

  1. हो रही है/मॉडल उदाहरण पर सीधे स्थापित करने
    उदहारण के लिए:

    अब तीन तरीकों मैं दृश्य से मॉडल डेटा को संपादित करने के लिए कैसे के साथ आया हैं सरल मान फ़ील्ड
    return _modelInst.fieldname;
    _modelInst.fieldname = value;
    के लिए यह एक के लागू करने में आसान ...

  2. एक ViewModel उदाहरण बनाना और माता-पिता के डेटा संरचना पर काम
    उदा

    • उस प्रकार के लिए एक नया ViewModel बनाना: structs की तरह अधिक जटिल वस्तु प्रकार के लिए।
      व्यूमोडेल माता-पिता और उसके फील्डनाम को जानता है।
    • एक ContentControl + DataTemplate
    • हो रही/सेटिंग में प्रदर्शित है कि:
      पैरामीटर के रूप में FIELDNAME,
      भले ही केवल एक ही क्षेत्र बदल गया है पूरे मूल वस्तु को अधिलेखित करने के साथ माता पिता की विधियों के माध्यम से

    इसका मतलब यह है कि इन संरचनाओं में से प्रत्येक के लिए माता-पिता द्वारा लागू किया गया एक नया इंटरफ़ेस (_modelInst पर काम कर रहे अद्यतन दिनचर्या के साथ)।

  3. माता पिता की डेटा संरचना का कोई प्रत्यक्ष ज्ञान के साथ ViewModel उदाहरणों बनाना
    उदा

    1. कमांड के माध्यम से (की सूची) कक्षाओं माता पिता कक्षाएं

      • प्रत्येक वर्ग

      • माता-पिता के लिए अद्यतन निर्देश भेजा जा रहा है के लिए एक नया ViewModel बनाना भीतर

      • संदेशों
      • प्रतिबिंब के लिए (माता-पिता जानता है कि किस बच्चे को उदाहरण की तुलना करके
        फ़ंक्शन कहा जाता है सभी संग्रहीत बच्चों के लिए)

    इन सभी के लिए एक बड़ा गड़बड़ को लागू करने, के लिए मॉडल है कि संपादन योग्य है के हर क्षेत्र कार्यों बनाने हैं।
    काफी मॉडल के सभी क्षेत्रों जिसका मतलब है ...

(4.) एक एक सामान्य ViewModel जो अकेले प्रतिबिंब के माध्यम से काम करता है, जहां प्रत्येक subobject अपनी मूल और उसके जानता है बना सकते हैं fieldname (+ सूचकांक, यदि एक सूची में)।
केवल रूट के तर्क मॉडल के साथ हस्तक्षेप करेंगे।
लेकिन उस समाधान को _modelInst के भीतर किसी फ़ील्ड को पथ स्टोर करने के साधनों की भी आवश्यकता होगी।

क्या यह हासिल करने के लिए कोई अन्य (अधिक सरल) तरीका है?
क्या मैंने एमवीवीएम (फिर से) के सिद्धांतों को गलत समझा?
क्या एमवीवीएम बड़े पदानुक्रमित डेटा संरचनाओं में हेरफेर के लिए अनुकूल है?

+0

एक मॉडल वस्तु के रूप में ग्राहक मानते हुए, एक CustomerViewModel जिसके लिए ICommand वस्तुओं को लागू करता है बनाएँ। फिर, आपका दृश्य इन आईसीओएमएंड वस्तुओं से जुड़ना चाहिए और आप ग्राहक के कमांड पैरामीटर में भेजते हैं (संभवतः आपके दृश्य में कहीं से बाध्यकारी)। –

+0

यह एक फ्लैट संरचना पर अच्छा काम करता है, उदा। ग्राहकों की एक सूची।लेकिन क्या होगा यदि मेरे पास एक जटिल पेड़ पदानुक्रम है, जैसे 'सूची संपर्क' जहां 'संपर्क' 'व्यापार, ग्राहक, निजी' और 'व्यवसाय' के आधारभूत आधार' की सूची '' है ...? –

+0

प्रत्येक मॉडल के लिए एक अलग दृश्य मॉडल, हाँ? व्युत्पन्न कक्षाओं के लिए, आप व्यवसाय के रूप में व्यवसाय व्यवसाय = संपर्क का प्रयास कर सकते हैं; यदि (व्यवसाय! = शून्य) [व्यवसाय से संबंधित सामान] ' –

उत्तर

1

उम्मीद है कि ये संसाधन मदद करेंगे; वे मेरे काफ़ी मदद की के रूप में मैं दृश्य मॉडल के साथ वस्तु रेखांकन/पदानुक्रम का प्रतिनिधित्व दृष्टिकोण MVVM और कैसे सीखा:

  1. Editable Object Adapter
  2. Editable Collection Adapter
  3. MicroModels
0

इस के लिए एक उत्कृष्ट सवाल यह है कि जो मुझे नहीं लगता कि एक अच्छा जवाब है जो एमवीसी पैटर्न के साथ स्टॉक आता है।

व्यू मॉडेल बहुत अच्छा काम करते हैं जब मॉडल के मानचित्र में कोई बच्चा नहीं होता है।

लेकिन मॉडल, बच्चे हैं जब के रूप में

में

ग्राहक

 -->Order 

     -->Country 

नीचे टूट जाता है के डिजाइन पैटर्न प्रकार (कल्पना देश ग्राहक का एक बच्चा वस्तु थे)।

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

सार्वजनिक वर्ग CustomerView: ग्राहक // inherits ग्राहक से (मॉडल) {

public CustomerView(Customer customer) 
{ 
     this.FirstName = customer.FirstName 
     //etc.. 

     //Only if you need it, that is if you have some display-specific 
     //logic relating to country for a given view, you create 
     //a CountryView class that inherits from Country and gets populated 
     //by an instance of it as well 
     this.CountryView = new CountryView(customer.Country) 
} 

public CountryView CountryView {get;set;} //sadly you cannot override Country but you may be able to shadow it. 

public string DisplayColor 
{ 
    if(base.FirstName == "Joe") 
    { 
     return "red"; 
    } 
    return ""; 
} 

}

यह गंदा हो जाता है जब पोते के साथ काम कर। अगर किसी के पास बेहतर समाधान है, तो मुझे यह सुनना अच्छा लगेगा। RetrieveCustomer, CreateCustomer, UpdateCustomer, DeleteCustomer (प्रकार ग्राहक की प्रत्येक पैरामीटर लेने):

धन्यवाद

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