2010-03-31 6 views
9

एमवीवीएम के लिए नया तो कृपया मेरी अज्ञानता क्षमा करें।एमवीवीएम - RaiseProperty एक गड़बड़ में कोड बदलना

मैं मैं इसे उपयोग कर रहा हूँ सही लगता है, लेकिन मुझे लगता है मेरी ViewModel इनमें से भी कई हैं:

RaisePropertyChanged("SomeProperty") 

हर बार जब मैं एक संपत्ति मैं सेट कि शापित संपत्ति जुटाने के लिए बदल दिया है।

मैं दिन याद आती है जहां मैं बस जा सकते हैं:

public int SomeInteger { get; private set;} 

इन दिनों मैं हर जगह में "RaisePropertyChanged" रहना है या मेरे यूआई परिवर्तन :(

को प्रतिबिंबित नहीं करता मैं कर रहा हूँ यह गलत या (मुझे शक है कि कोड ब्लोट वैसे भी मदद मिलेगी)

०१२३५१६४१० अन्य लोगों को जादू तार और पुराने स्कूल संपत्ति setters की अत्यधिक संख्या के साथ नाराज हो रही हैं?

मैं निर्भरता गुण बजाय प्रयोग करना चाहिए?

इन समस्याओं के बावजूद मुझे अभी भी लगता है कि एमवीवीएम जाने का रास्ता है इसलिए मुझे लगता है कि यह कुछ है।

+1

"मुझे उन दिनों की याद आती है जहां मैं जा सकता हूं" हम कितनी आसानी से भूल जाते हैं, सी # 2 में आप ऐसा नहीं कर सके। ;) – AnthonyWJones

+0

या मुझे लगता है कि मैं खराब हो गया हूं लेकिन प्रगति के बावजूद, मुझे अभी भी लगता है कि इस सामान को लागू करने के लिए एक क्लीनर तरीका हो सकता है। मुझे आंतरिक कार्य/ट्रेडऑफ पर्याप्त नहीं पता है ... – vidalsasoon

उत्तर

12

इस What is the best or most interesting use of Extension Methods you've seen? पर एक नज़र डालें।

यह एक विस्तार विधि और एक सहायक विधि है कि मेरे मॉडल और ViewModel वर्गों निम्नलिखित दृढ़ता से लिखा जाता है (कोई जादू स्ट्रिंग) गुण सक्षम करने के लिए उपयोग करने का वर्णन है।

private string _name; 
public string Name 
{ 
    get { return _name; } 
    set { this.NotifySetProperty(ref _name, value,() => this.Name); } 
} 

यह उतना आसान है जितना मुझे लगता है कि यह प्राप्त हो सकता है। आशा करता हूँ की ये काम करेगा।

+0

धन्यवाद। मुझे यह जानकर खुशी हुई कि मैं अकेले मुद्दों पर नहीं था। – vidalsasoon

4

यह एक अलग नजरिए से चीजों को देखने में मदद करता है: उन नेट गुण जटिल नहीं हैं, लेकिन सरलीकृत निर्भरता गुण।

WPF में एक दृश्य के मॉडल की Bindable गुण, गुण नेट के लिए समान नहीं हैं बजाय यह कुंजी-मान की दुकान की तरह है। यदि आप निर्भरता ऑब्जेक्ट के लाइट-वेट विकल्प चाहते हैं, तो आपके पास इस कुंजी-मूल्य स्टोर को लागू करने की क्षमता है बस सेटर्स में कुछ फ़ंक्शन को कॉल करना - वास्तव में बुरा नहीं। बिल्कुल भी आदर्श से, लेकिन आपका दृष्टिकोण निश्चित रूप से अनुचित है।

8

आप PostSharp की NotifyPropertyChanged विशेषता का उपयोग कर सकते हैं। तो आपको बस कक्षा में एक विशेषता डालना है और यही वह है। उदा .:

[NotifyPropertyChanged] 
public class MyClass 
{ 
    public string MyProperty { get; set; } 
} 
+0

दिलचस्प! हालांकि ओवरहेड के बारे में उत्सुक ... – vidalsasoon

+3

कोई रनटाइम ओवरहेड नहीं है क्योंकि पोस्टशर्प बस संकलित कक्षा को संशोधित करता है और मैन्युअल रूप से लिखने वाले सटीक कोड को इंजेक्ट करता है। एक छोटा सा निर्माण समय ओवरहेड है लेकिन मुझे यह नगण्य पाया गया। –

+0

इस दृष्टिकोण के लिए एकमात्र कमी यह है कि कभी-कभी राइजप्रोपर्टी को उस संपत्ति के लिए बदल दिया जाता है जहां सेटर को बुलाया जा रहा है। – Random

0

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

विस्तार विधि बस इस प्रकार है:

public static string GetPropertyName(this MethodBase methodBase) 
{ 
    return methodBase.Name.Substring(4); 
} 

इसके साथ ही इसका मतलब है कि आप संपत्ति सेट नाम परिवर्तन के खिलाफ लचीला कर रहे हैं और कुछ ऐसी नज़र:

private string _name; 
public string Name 
{ 
    get { return _name; } 
    set 
    { 
      name = value; 
      RaisePropertyChanged(MethodBase.GetCurrentMethod().GetPropertyName()); 
    } 
} 

मैं और अधिक लिखा है इस extension method here के बारे में और मेरे पास published a matching code snippet here है।

+0

पुराना सवाल, मुझे पता है :) एक और तरीका है RaiseProperty को बेस क्लास के अंदर बदलें और निम्न विधि हस्ताक्षर का उपयोग करें: OnRaisePropertyChanged ([CallerMemberName] propertyName = "")। इस तरह आप संपत्ति नाम लिखने के बिना विधि को कॉल कर सकते हैं –

0

यह मदद मिलेगी: "जादू के प्रकार" बिना प्रयास INotifyPropertyChanged

[http://visualstudiogallery.msdn.microsoft.com/d5cd6aa1-57a5-4aaa-a2be-969c6db7f88a][1]

एक संपत्ति में जोड़ने के लिए एक उदाहरण के रूप:

01: सभी वर्ग गुण में जोड़ने के लिए

[Magic] 
public string Name { get { return _name; } set { _name = value; } } 
string _name; 

एक और उदाहरण

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