2013-02-14 56 views
7

मुझे अपने डब्ल्यूपीएफ एमवीवीएम (प्रिज्म आधारित) एप्लिकेशन में कुछ डिज़ाइन प्रश्नों का सामना करना पड़ रहा है, आपकी सलाह लेने में खुशी होगी। मेरे मॉडल बहुत सरल है:मॉडल में बदलकर INotifyProperty जोड़ना?

public class Customer 
{ 
    public string FirstName {get;set;} 
    public string LastName {get;set;} 
} 

आप देख सकते हैं, मैं अपने मॉडल वर्ग के लिए किसी भी INotifyPropertyChnaged का समर्थन नहीं है। मेरे पास ग्राहक विवरण स्क्रीन के लिए व्यूमोडेल भी है, जो INotifyPropertyChanged का समर्थन करता है।

public class CustomerDetailsViewModel:INotifyPropertyChanged /*Or NotificationObject*/ 
{ 
    /*INotifyPropertyChanged event */ 
    private Customer item; 
    public Customer Item 
    { 
     get{return item;} 
     set 
     { 
     item=value; 
     //Raise PropertyChanged 
     //Set IsDirty to true 
     } 
    } 
} 

मेरे विचार में, मैं आइटम पर बाध्यकारी का उपयोग कर रहा हूं। फर्स्टनाम और मेरा व्यू मॉडेल अपडेट किया जा रहा है। मेरी समस्या यह है - चूंकि केवल फर्स्टनाम संपत्ति को व्यू के माध्यम से अपडेट किया जा रहा है, और मॉडल स्वयं इनोटिफ़ाईप्रॉपर्टी का समर्थन नहीं करता है, इसलिए आइटम सेटटर नहीं कहा जा रहा है, और IsDirty झूठ के बराबर रहता है (और इसलिए IsDirty अधिसूचना को अद्यतन नहीं करता है यूआई पर)।

मैं जानता हूँ कि मैं मॉडल में INotifyPropertyChanged समर्थन कर सकते हैं और उसके बाद दृश्य मॉडल में Item.PropertyChanged घटना रजिस्टर, और वास्तव में सच करने के लिए IsDirty निर्धारित करते हैं, लेकिन - जब से मैं भी CodeFirst, और मेरे मॉडल का उपयोग कर रहा क्लास मेरे सर्वरसाइड और मेरे क्लाइंट साइड (सेवा जोड़ें संदर्भ का उपयोग नहीं कर रहा है) के बीच साझा किया गया है, मैं अपने सर्वर पक्ष में INotifyPreoprtyChanged सामान को जोड़ना नहीं चाहता हूं।

मैं नई परियोजना बनाने पर विचार कर रहा हूं, जो मेरी सभी इकाइयों (ग्राहक के रूप में) एक को प्रतिलिपि बनाने और प्रत्येक मॉडल को INOTifyPropertyChanged समर्थन जोड़ने के लिए टी 4 टेम्पलेट का उपयोग करेगा। क्या ऐसा कुछ है जो उचित लगता है या नहीं? कोई अन्य सुझाव?

धन्यवाद!

उत्तर

4

विकल्प 1।
अलग-अलग इकाइयां, जो क्लाइंट और सर्वर (डीटीओ) के बीच स्थानांतरित की जा रही हैं, जो संस्थाओं से हैं, जो क्लाइंट साइड पर मॉडल हैं। मॉडल में INPC लागू करें। इन इकाइयों के बीच मैपिंग का प्रयोग करें।

विकल्प 2।
केवल मॉडल गुण देखने के लिए बाध्य दृश्य। दृश्य मॉडल गुण बनाएं, जो संबंधित मॉडल गुणों को लपेटें।

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

0

मुझे लगता है कि आप सही रास्ते पर हैं। सर्वर की ओर, आपको INotifyPropertyChanged की आवश्यकता नहीं है, इस प्रकार इसे सर्वर की ओर से डोमेन कक्षाओं में शामिल न करें।

आप अपने क्लाइंट प्रोजेक्ट्स में "WPF" जैसे कुछ बिल्ड प्रतीक जोड़ सकते हैं; और कोड में पहली परिभाषाएं केवल INotifyPropertyChanged लागू करती हैं यदि "WPF" निर्माण प्रतीक है। फिर बस अपने सर्वर साइड डोमेन कक्षाओं को अपने प्रेजेंटेशन एप्लिकेशन के लिंक के रूप में जोड़ें। कुछ इस तरह;

#if WPF 
public class MyEntity : INotifyPropertyChanged 
#else 
public class MyEntity 

.... 
1

वैसे आपका दृष्टिकोण सबसे अच्छा नहीं है। इस


public class CustomerDetailsViewModel : INotifyPropertyChanged 
{ 
    public CustomerDetailsViewModel(Customer customer) 
    { 
    _item = customer; 
    } 
    private Customer _item; 

    public string FirstName 
    { 
    get { return _item != null ? _item.FirstName : null; } 
    set 
    { 
     if (_item == null) 
     _item = new Customer(); // just an example, probably it's not the desired behavior 
     _item.FirstName = value; 
     RaisePropertyChanged(...); 
    } 
    } 
    ... 
} 

जैसे वीएम का उपयोग करना बेहतर होगा यह एमवीवीएम की भावना से चिपकेगा।

+2

मैं समझता हूँ कि आप क्या कह रहे हैं का समर्थन करेंगे, लेकिन यह (लगभग) कोई कारण नहीं के लिए कोडिंग के बहुत सारे की आवश्यकता होगी। क्या मुझे अपने मॉडल मॉडल में मेरे मॉडल की हर संपत्ति को डुप्लिकेट करना चाहिए ??? – Asaf

+0

@ एसाफ आप सही हैं। मैं आपकी परियोजना को नहीं जानता। यदि यह सिर्फ एक छोटा सा है, तो यह एक बड़ा ओवरहेड हो सकता है। लेकिन बड़ी परियोजनाओं में, जब आपके पास टेस्टेबिलिटी जैसी अतिरिक्त आवश्यकताएं होती हैं, तो डी.एस.ओ. यह उन्हें प्राप्त करने का एक तरीका होगा। – DHN

1

आप जब अपने मॉडल संपत्ति बदल अपने यूआई सूचना के लिए चाहते हैं, अपने मॉडल वर्ग MUSTINotifyPropertyChanged और इसी तरह MVVM इंटरफेस को लागू (IDataErrorInfo, आदि ...) क्रम में Notify लिए यूआई कि property changed करने के लिए।

ऐसा इसलिए है क्योंकि आप हमेशा अपने मॉडल को व्यूमोडेल से अपडेट नहीं कर रहे हैं, जहां आपको INotifyProperyChanged लागू करना होगा और परिवर्तनों के लिए सूचित करना होगा।

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

परिदृश्य:

public class Customer 
{ 
    public string FirstName {get;set;} 
    public string LastName {get;set;} 

    // Changes the first name. 
    public void ChangeFirstName(string newName) 
    { 
     FirstName = newName; 
     //The UI will never know that the property changed, and it won't update. 
    } 
} 

समाधान:

आप में मॉडल वर्ग INotifyPropertyChanged लागू करें, अपने properties करने के लिए backing fields बनाएं और प्रत्येक संपत्ति setter के लिए, के बाद set आपरेशन, बढ़ा साथ OnPropertyChanged लागू विधि property नाम।

0

आप INotifyPropertyChanged कोड आप एक NUGet पैकेज PropertyChanged.Fody

कहा जाता है का उपयोग कर की कोशिश कर सकते के साथ अपने मॉडल को अस्त-व्यस्त करने के लिए पसंद नहीं है

आप इसे इस तरह उपयोग कर सकते हैं;

using PropertyChanged; 

[ImplementPropertyChanged] 
public class Customer 
{ 
    public string FirstName {get;set;} 
    public string LastName {get;set;} 
} 

इस वर्ग में किसी भी सार्वजनिक संपत्ति अब INotifyPropertyChanged