खोज…


टिप्पणियों

जब भी आपको अपनी कक्षा को इसके गुणों के लिए होने वाले परिवर्तनों की रिपोर्ट करने की आवश्यकता होती है, तो इंटरफ़ेस 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;

}


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow