INotifyPropertyChangedã¤ã³ã¿ã¼ãã§ã¼ã¹ã§ã馴æã¿ã®PropertyChangedã¤ãã³ãã§ãããããã®ã¤ãã³ããã³ãã©ã®ã³ã¼ããæ°ã«å ¥ããªããã¨ãããæ¸ãã¦ã¦ãã¡ãã£ã¨ãªãã ããªãã¨æã£ã¦ãã¾ãã¾ãã
ä¾ãã°ã以ä¸ã®ãããªNameããããã£ã¨Ageããããã£ãæã£ãINotifyPropertyChangedã¤ã³ã¿ã¼ãã§ã¼ã¹ãå®è£ ããPersonã¯ã©ã¹ããã£ãã¨ãã¾ãã
public class Person : INotifyPropertyChanged { private string _name; public string Name { get { return _name; } set { if (Equals(_name, value)) return; _name = value; OnPropertyChanged("Name"); } } private int _age; public int Age { get { return _age; } set { if (Equals(_age, value)) return; _age = value; OnPropertyChanged("Age"); } } #region INotifyPropertyChanged ã¡ã³ã public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string name) { if (PropertyChanged == null) return; PropertyChanged(this, new PropertyChangedEventArgs(name)); } #endregion }
ãªãã®å¤å²ããªããã¯ã©ã¹ã§ããããã¦ãããã¤ã®Nameã¨Ageããããã£ã«å¤æ´ããã£ããã³ã³ã½ã¼ã«ã«å¤æ´ããã£ãæ¨ã¨ãå¤æ´å¾ã®å¤ãåºåãããããªå¦çãæ¸ããªãã¨ãããªãã¨ãããã以ä¸ã®ãããªæãã«ãªãã¨æãã¾ãã
class Program { static void Main(string[] args) { var p = new Person(); // ããããã£ã«å¤æ´ããã£ãå ´åã«å¼ã³åºãããã¤ãã³ããç»é² p.PropertyChanged += NameChanged; p.PropertyChanged += AgeChanged; p.Name = "ç°ä¸"; p.Age = 100; } private static void NameChanged(object sender, PropertyChangedEventArgs e) { // æååã§ããããã£åãå¤å¥ if (e.PropertyName != "Name") return; // ããã¦ãã£ã¹ã var p = (Person)sender; // åã ã®å¦ç Console.WriteLine("ååãå¤æ´ããã¾ãã: " + p.Name); } private static void AgeChanged(object sender, PropertyChangedEventArgs e) { // æååã§ããããã£åãå¤å¥ if (e.PropertyName != "Age") return; // ããã¦ãã£ã¹ã var p = (Person)sender; // åã ã®å¦ç Console.WriteLine("å¹´é½¢ãå¤æ´ããã¾ãã: " + p.Age); } }
ä»åã¯ãããããã£ãã¨ã«ã¤ãã³ããã³ãã©ãããã¾ãããï¼ã¤ã«ã¾ã¨ãã¦ãswitchæãifæã§ããããã£åã§æ¡ä»¶åå²ãã¦ãOKã§ãããã®å ´åã¯ãä¸ã®ããã«ãªãã¾ãã
class Program { static void Main(string[] args) { var p = new Person(); // ããããã£ã«å¤æ´ããã£ãå ´åã«å¼ã³åºãããã¤ãã³ããç»é² p.PropertyChanged += PersonPropertyChanged; p.Name = "ç°ä¸"; p.Age = 100; } private static void PersonPropertyChanged(object sender, PropertyChangedEventArgs e) { var p = (Person)sender; switch (e.PropertyName) { case "Name": Console.WriteLine("ååãå¤æ´ããã¾ãã: " + p.Name); break; case "Age": Console.WriteLine("å¹´é½¢ãå¤æ´ããã¾ãã: " + p.Age); break; default: // å¦çç¡ã break; } } }
ã©ã¡ãã«ãã¦ãå ±éããã®ãããã³ãã©å ã§æååã§ããããã£åãå¤æããªãã¨ãããªããã¨ã¨ãå¤æ´ããã£ããªãã¸ã§ã¯ãã«ã¢ã¯ã»ã¹ãããã¨ããã¨ããã£ã¹ãããªãã¨ãããªãã¨ããæéãããã¾ããã¡ãã£ã¨ããæéã§ãããã¿ã¤ããã¹ãå¿é ã ã¨ããæ¯åæ¸ãã®ã¯ããã©ãã ã¨ãè²ã å人çã«ã¡ã³ãã¯ãµã¤ã¨æã£ã¦ã¾ãã
ã¨ãããã¨ã§ãåã«ãã£ãã¿ã¤ãã»ã¼ããªINotifyPropertyChangedã®å®è£ ã®æ¹æ³ãå¿ç¨ããã¨ä»¥ä¸ã®ããã«æ¸ãããªãã¨æãã¤ãã¾ããã
- [C#][WPF]ã¿ã¤ãã»ã¼ãã«INotifyPropertyChangedã¤ã³ã¿ã¼ãã§ã¼ã¹ã®PropertyChangedã¤ãã³ããçºè¡ãã
ã¾ããINofityPropertyChangedã¤ã³ã¿ã¼ãã§ã¼ã¹ãå®è£ ãã¦ããã¯ã©ã¹ã«å¯¾ãã¦ä»¥ä¸ã®ãããªæ¡å¼µã¡ã½ãããå®ç¾©ãã¾ãã
public static class NotifyPropertyChangedEx { public static void AddPropertyChanged<TObj, TProp>(this TObj _this, Expression<Func<TObj, TProp>> propertyName, Action<TObj> handler) where TObj : INotifyPropertyChanged { // ããããã£åãåå¾ã㦠var name = ((MemberExpression)propertyName.Body).Member.Name; // å¼æ°ã§æå®ãããããããã£åã¨åãã ã£ãããhandlerãå®è¡ããããã« // PropertyChangedã¤ãã³ãã«ç»é²ãã _this.PropertyChanged += (sender, e) => { if (e.PropertyName == name) { handler(_this); } }; } }
ããã¦ãããã使ãããã«Programã¯ã©ã¹ã®ä¸ãæ¸ãæããã¨â¦
class Program { static void Main(string[] args) { var p = new Person(); // ããããã£ã«å¤æ´ããã£ãå ´åã«å¼ã³åºãããã¤ãã³ããç»é² p.AddPropertyChanged(o => o.Name, NameChanged); p.AddPropertyChanged(o => o.Age, AgeChanged); p.Name = "ç°ä¸"; p.Age = 100; } // ååã«å¤æ´ããã£ãã¨ãã®å¦ç private static void NameChanged(Person p) { Console.WriteLine("ååã«å¤æ´ãããã¾ãã: " + p.Name); } // å¹´é½¢ã«å¤æ´ããã£ãã¨ãã®å¦ç private static void AgeChanged(Person p) { Console.WriteLine("å¹´é½¢ã«å¤æ´ãããã¾ãã: " + p.Age); } }
ããããã£åã®æå®é¨åããã©ã ãå¼ã§ãã£ããæ¸ããããã«ãªãã®ã¨ãåããããã£ãå¤æ´ãããã¨ãã®å¦çã®å¼æ°ãã.NETã®ã¤ãã³ãã®objectåã¨***EventArgsåã¨ããã¿ããã¡ããããªãã®ã§ã¯ãªããPersonã¯ã©ã¹ãæåãã渡ã£ã¦ããããã«ãªãã¾ãã
ã¨ã¾ããæãã¤ããã®ã§Blogã«æ¸ãã¦ããã¾ãããã¯ããã¦ã³ã¼ãã§PropertyChangedãèªåã§å®è£ ããã¨ãããã¨ããã©ãã ãããã®ãã»ã»ã»ï¼ã¨åãããã¨ããããªã«ç¡ãã®ããªãã¨ãæã£ããæããªãã£ãããã¦ã¾ããã¯ãã