Inotifypropertychanged propertychanged, где это событие задается? - C#

Узнай цену своей работы

Формулировка задачи:

почти во всех примерах показано так;
class Model:INotifyPropertyChanged {
    public event PropertyChangedEventHandler PropertyChanged;
 
    protected void NotifyPropertyChanged(string name) {
       var propertyChanged = PropertyChanged;
        if (propertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
 
    public string Name {
        get { return name; } 
        set {
            name = value;
            NotifyPropertyChanged("Name");
        } 
    }
}
либо так, чтобы не делать лишнии присваивания и проверки
class Model:INotifyPropertyChanged {
    public event PropertyChangedEventHandler PropertyChanged = (o, e) => { };
 
    protected void NotifyPropertyChanged(string name) {
        PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
 
    public string Name {
        get { return name; } 
        set {
            name = value;
            NotifyPropertyChanged("Name");
        } 
    }
}
но явно нигде событие PropertyChanged не регистрируется какому нибуть обработчику(методу), получается компилятор сам это делает ?

Решение задачи: «Inotifypropertychanged propertychanged, где это событие задается?»

textual
Листинг программы
using System;
using System.ComponentModel;
using System.Windows.Forms;
 
namespace WindowsFormsApplication299
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            var dummyObject = new DummyClass();
 
            new MyLabel(dummyObject){Parent = this};
        }
    }
 
    public class MyLabel : Label
    {
        private object source;
 
        public MyLabel(object source)
        {
            this.source = source;
            //если объект поддерживает INotifyPropertyChanged, то подписываемся на событие
            if(source is INotifyPropertyChanged)
                (source as INotifyPropertyChanged).PropertyChanged += MyLabel_PropertyChanged;
        }
 
        void MyLabel_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            //получаем измененное свойство
            Text = source.GetType().GetProperty(e.PropertyName).GetValue(source, null).ToString();
        }
    }
 
    class DummyClass : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged = delegate { };
 
        private string name;
 
        public string Name
        {
            get { return name; }
            set
            {
                name = value;
                NotifyPropertyChanged("Name");
            }
        }
 
        public DummyClass()
        {
            //свойство Name периодически получает новое значение
            Application.Idle += delegate { Name = DateTime.Now.ToLongTimeString(); };
        }
 
        protected void NotifyPropertyChanged(string name)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.636 из 5
Похожие ответы