NotifyPropertyChanged.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Linq;
  5. using System.Linq.Expressions;
  6. using System.Reflection;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace WeChatCore.Common
  10. {
  11. public class NotifyPropertyChanged : INotifyPropertyChanged
  12. {
  13. public event PropertyChangedEventHandler PropertyChanged;
  14. /// <summary>
  15. /// 一般实现通知办法
  16. /// </summary>
  17. /// <param name="PropertyName"></param>
  18. public void RaisePropertyChanged(string PropertyName)
  19. {
  20. if (PropertyChanged != null)
  21. {
  22. PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
  23. }
  24. }
  25. /// <summary>
  26. /// 监听属性改变并发出通知
  27. /// </summary>
  28. /// <typeparam name="T">类型</typeparam>
  29. /// <param name="proertyExpression">属性表达式</param>
  30. public void RaisePropertyChanged<T>(Expression<Func<T>> proertyExpression)
  31. {
  32. if (PropertyChanged != null)
  33. {
  34. string propertyName = GetPropertyName<T>(proertyExpression);
  35. this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  36. }
  37. }
  38. /// </summary>
  39. /// <typeparam name="T">属性</typeparam>
  40. /// <param name="proertyExpression">Linq表达式</param>
  41. /// <returns></returns>
  42. private string GetPropertyName<T>(Expression<Func<T>> proertyExpression)
  43. {
  44. if (proertyExpression == null)
  45. {
  46. throw new ArgumentNullException("proertyExpression");
  47. }
  48. MemberExpression mp = proertyExpression.Body as MemberExpression;
  49. if (mp == null)
  50. {
  51. throw new ArgumentException("Invalid Argument", "proertyExpression");
  52. }
  53. PropertyInfo proInfo = mp.Member as PropertyInfo;
  54. if (proInfo == null)
  55. {
  56. throw new ArgumentException("Argument is not a property", "proertyExpression");
  57. }
  58. return proInfo.Name;
  59. }
  60. }
  61. }