IMHO, स्वीकार किए जाते हैं जवाब में के रूप में PostSharp दृष्टिकोण, बहुत अच्छा है और निश्चित रूप से प्रश्न पूछा का सीधा जवाब है।
हालांकि, उन लोगों के लिए जो सी # भाषा सिंटैक्स का विस्तार करने के लिए पोस्टशर्प जैसे टूल का उपयोग नहीं कर सकते हैं या नहीं करेंगे, किसी को बेस क्लास के साथ कोड पुनरावृत्ति से बचने का अधिक लाभ मिल सकता है जो INotifyPropertyChanged
लागू करता है।
/// <summary>
/// Base class for classes that need to implement <see cref="INotifyPropertyChanged"/>
/// </summary>
public class NotifyPropertyChangedBase : INotifyPropertyChanged
{
/// <summary>
/// Raised when a property value changes
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// Updates a field for a named property
/// </summary>
/// <typeparam name="T">The type of the field</typeparam>
/// <param name="field">The field itself, passed by-reference</param>
/// <param name="newValue">The new value for the field</param>
/// <param name="propertyName">The name of the associated property</param>
protected void UpdatePropertyField<T>(ref T field, T newValue, [CallerMemberName] string propertyName = null)
{
if (!EqualityComparer<T>.Default.Equals(field, newValue))
{
field = newValue;
OnPropertyChanged(propertyName);
}
}
/// <summary>
/// Raises the <see cref="PropertyChanged"/> event.
/// </summary>
/// <param name="propertyName">The name of the property that has been changed</param>
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.DynamicInvoke(this, new PropertyChangedEventArgs(propertyName));
}
}
, प्रयुक्त उदाहरण के लिए, इस तरह::
ऐसे कई उदाहरण चारों ओर झूठ बोल रहे हैं, लेकिन कोई भी अब तक इस उपयोगी और अच्छी तरह से पाठकों वाले प्रश्न में शामिल किया गया है, इसलिए यहाँ संस्करण मैं आम तौर पर इस्तेमाल करते हैं
private int _value;
public int Value
{
get { return _value; }
set { UpdatePropertyField(ref _value, value); }
}
काफी के रूप में सिर्फ PostSharp दृष्टिकोण में के रूप में एक स्वत: लागू किया संपत्ति के लिए एक कोड विशेषता लागू करने में सक्षम होने के रूप में संक्षिप्त, लेकिन अभी भी नहीं किए गए दृश्य मॉडल और अन्य समान प्रकार के कार्यान्वयन में तेजी के लिए एक लंबा रास्ता जाता है।
कि ऊपर प्रमुख विशेषताओं कुछ अन्य कार्यान्वयन से इसकी अलग पहचान:
- समानता
EqualityComparer<T>.Default
का उपयोग कर तुलना में है। यह सुनिश्चित करता है कि बॉक्स प्रकारों के बिना मूल्य प्रकारों की तुलना की जा सकती है (एक सामान्य विकल्प object.Equals(object, object)
होगा)। IEqualityComparer<T>
उदाहरण कैश किया गया है, इसलिए किसी दिए गए प्रकार T
के लिए पहली तुलना के बाद, यह बहुत ही कुशल है।
OnPropertyChanged()
विधि virtual
है। यह व्युत्पन्न प्रकारों को PropertyChanged
ईवेंट (उदाहरण के लिए विरासत के कई स्तरों के लिए) की सदस्यता लेने के बिना, केंद्रीकृत तरीके से संपत्ति परिवर्तित घटनाओं को आसानी से और कुशलता से संभालने की अनुमति देता है और निश्चित रूप से व्युत्पन्न प्रकार को नियंत्रित करता है कि यह कैसे और कब संभालता है संपत्ति ने वास्तविक PropertyChanged
ईवेंट को बढ़ाने के सापेक्ष घटना को बदल दिया।
स्रोत
2016-09-09 20:27:45
क्या आपको हमेशा 'if (m_Fieldname! = Value) {...}' की जांच नहीं करनी चाहिए? यह अधिक कोड है, मुझे पता है, लेकिन 'PropertyChanged' को बढ़ाने से संपत्ति ठीक नहीं होती है, तो सही नहीं लगता है। –
@Danko, धन्यवाद अच्छा बिंदु –
व्यक्तिगत रूप से, मैं सिर्फ एक आधार ObservableItem वर्ग (जिसमें से मेरी ViewModelBase निकला है) में एक SetProperty विधि है कि सभी सूचनाएं, समानता की जाँच, संपत्ति की स्थापना, आदि यह अच्छे और साफ है संभालती है, और आप अभी भी केवल एक-लाइनर हो जाता है और सेट करता है। इसके अलावा, उन्हें बनाने के लिए बस एक कोड स्निपेट सेट करें, और इसकी त्वरित, सरल और मानकीकृत। –