有时候,我们需要监听属性值的变化,当属性值发生改变时,需要被通知,没有改变时不需要通知,这个时候可以用INotifyPropertyChanged来做,也可以自定义委托事件,也可以实现,方法多多,在这里只介绍INotifyPropertyChanged的方法,目的是当属性值发生变化时,才触发事件

    案例: 创建一个父类Person,继承INotifyPropertyChanged类,然后让Man类去继承
    Person类:

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Text;
    4. using System.ComponentModel;
    5. namespace Demo
    6. {
    7. public delegate void ChangedHandler(object sender, object v);
    8. public class Person : INotifyPropertyChanged
    9. {
    10. #region INotifyPropertyChanged 成员
    11. public event PropertyChangedEventHandler PropertyChanged;
    12. public virtual void OnPropertyChanged(string propertyName)
    13. {
    14. PropertyChangedEventHandler hander = PropertyChanged;
    15. if (hander != null)
    16. hander(this, new PropertyChangedEventArgs(propertyName));
    17. }
    18. #endregion
    19. /// <summary>
    20. /// 属性变换事件
    21. /// </summary>
    22. /// <param name="sender">源</param>
    23. /// <param name="v">变化后的值</param>
    24. /// <param name="old">变化前的值</param>
    25. /// <param name="hander"></param>
    26. protected virtual void OnChanged(object sender, object v, object old, ChangedHandler hander)
    27. {
    28. if (!v.Equals(old) && hander != null)
    29. hander(sender, v);
    30. }
    31. }
    32. }

    Man类

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. namespace Demo
    6. {
    7. public class Man:Person
    8. {
    9. public event ChangedHandler ChangeName;
    10. public event ChangedHandler ChangeAge;
    11. string name = string.Empty;
    12. public virtual string Name
    13. {
    14. get { return name; }
    15. set
    16. {
    17. base.OnChanged(this, value, Name, ChangeName);
    18. name = value;
    19. OnPropertyChanged("Name");
    20. }
    21. }
    22. int age = 10;
    23. public virtual int Age
    24. {
    25. get { return age; }
    26. set
    27. {
    28. base.OnChanged(this, value, Age, ChangeAge);
    29. age = value;
    30. OnPropertyChanged("Age");
    31. }
    32. }
    33. }
    34. }



    Form1 界面

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Windows.Forms;
    9. using System;
    10. using System.Collections.Generic;
    11. using System.Text;
    12. using System.ComponentModel;
    13. namespace Demo
    14. {
    15. public partial class Form1 : Form
    16. {
    17. public Form1()
    18. {
    19. InitializeComponent();
    20. }
    21. Man m = new Man();
    22. private void Form1_Load(object sender, EventArgs e)
    23. {
    24. m.ChangeName += new ChangedHandler(m_ChangeName);
    25. m.ChangeAge += new ChangedHandler(m_ChangeAge);
    26. }
    27. void m_ChangeAge(object sender, object v)
    28. {
    29. SetText("m.Age " + v.ToString());
    30. }
    31. void m_ChangeName(object sender, object v)
    32. {
    33. SetText("m.Name " + v.ToString());
    34. }
    35. private void btnName_Click(object sender, System.EventArgs e)
    36. {
    37. m.Name = textBox2.Text;
    38. }
    39. public void SetText(string txt)
    40. {
    41. textBox1.Text += txt+ "\r\n";
    42. }
    43. private void btnAge_Click(object sender, System.EventArgs e)
    44. {
    45. m.Age = int.Parse(textBox3.Text);
    46. }
    47. }
    48. }








    C# INotifyPropertyChanged用法,监听属性值发生改变 - 图1
    https://blog.csdn.net/taoerit/article/details/54290623?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param