C# Language
INotifyPropertyChanged इंटरफ़ेस
खोज…
टिप्पणियों
जब भी आपको अपनी कक्षा को इसके गुणों के लिए होने वाले परिवर्तनों की रिपोर्ट करने की आवश्यकता होती है, तो इंटरफ़ेस INotifyPropertyChanged
की आवश्यकता होती है। इंटरफ़ेस एक एकल घटना को परिभाषित करता है PropertyChanged
।
XAML बाइंडिंग के साथ PropertyChanged
इवेंट स्वचालित रूप से वायर्ड हो जाता है, इसलिए आपको XAML बाइंडिंग के साथ काम करने के लिए केवल अपने व्यू मॉडल या डेटा संदर्भ कक्षाओं पर INotifyPropertyChanged इंटरफ़ेस लागू करना होगा।
C # 6 में INotifyPropertyChanged लागू करना
INotifyPropertyChange
कार्यान्वयन में त्रुटि हो सकती है, क्योंकि इंटरफ़ेस को एक स्ट्रिंग के रूप में संपत्ति के नाम को निर्दिष्ट करने की आवश्यकता होती है। कार्यान्वयन को अधिक मजबूत बनाने के लिए, एक विशेषता CallerMemberName
का उपयोग किया जा सकता है।
class C : INotifyPropertyChanged
{
// backing field
int offset;
// property
public int Offset
{
get
{
return offset;
}
set
{
if (offset == value)
return;
offset = value;
RaisePropertyChanged();
}
}
// helper method for raising PropertyChanged event
void RaisePropertyChanged([CallerMemberName] string propertyName = null) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
// interface implemetation
public event PropertyChangedEventHandler PropertyChanged;
}
यदि आपके पास INotifyPropertyChanged
लागू करने वाले कई वर्ग हैं, तो आपको इंटरफ़ेस कार्यान्वयन और हेल्पर विधि को सामान्य आधार वर्ग के लिए फिर से सक्रिय करना उपयोगी हो सकता है:
class NotifyPropertyChangedImpl : INotifyPropertyChanged
{
protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
// interface implemetation
public event PropertyChangedEventHandler PropertyChanged;
}
class C : NotifyPropertyChangedImpl
{
int offset;
public int Offset
{
get { return offset; }
set { if (offset != value) { offset = value; RaisePropertyChanged(); } }
}
}
सामान्य सेट विधि के साथ InotifyPropertyChanged
नीचे NotifyPropertyChangedBase
वर्ग एक सामान्य सेट विधि को परिभाषित करता है जिसे किसी भी व्युत्पन्न प्रकार से बुलाया जा सकता है।
public class NotifyPropertyChangedBase : INotifyPropertyChanged
{
protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
public event PropertyChangedEventHandler PropertyChanged;
public virtual bool Set<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
{
if (Equals(field, value))
return false;
storage = value;
RaisePropertyChanged(propertyName);
return true;
}
}
इस सामान्य सेट विधि का उपयोग करने के लिए, आपको बस एक वर्ग बनाने की जरूरत है जो NotifyPropertyChangedBase से निकलता है।
public class SomeViewModel : NotifyPropertyChangedBase
{
private string _foo;
private int _bar;
public string Foo
{
get { return _foo; }
set { Set(ref _foo, value); }
}
public int Bar
{
get { return _bar; }
set { Set(ref _bar, value); }
}
}
जैसा कि ऊपर दिखाया गया है, आप Set(ref _fieldName, value);
को कॉल कर सकते हैं Set(ref _fieldName, value);
एक संपत्ति के सेटर में और यह जरूरत पड़ने पर अपने आप एक PropertyChanged घटना को बढ़ा देगा।
फिर आप किसी अन्य वर्ग से प्रॉपर्टीचेंज घटना में पंजीकरण कर सकते हैं जिसे संपत्ति परिवर्तनों को संभालने की आवश्यकता है।
public class SomeListener
{
public SomeListener()
{
_vm = new SomeViewModel();
_vm.PropertyChanged += OnViewModelPropertyChanged;
}
private void OnViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)
{
Console.WriteLine($"Property {e.PropertyName} was changed.");
}
private readonly SomeViewModel _vm;
}