Inotifypropertychanged propertychanged, где это событие задается? - C#
Формулировка задачи:
почти во всех примерах показано так;
либо так, чтобы не делать лишнии присваивания и проверки
но явно нигде событие PropertyChanged не регистрируется какому нибуть обработчику(методу), получается компилятор сам это делает ?
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");
}
}
}Решение задачи: «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));
}
}
}