1、核心类BaseNotifyPropertyChanged ,主要用来封装NotifyProperty的执行方法
View Code
1 public abstract class BaseNotifyPropertyChanged : INotifyPropertyChanged
2 {
3 public event PropertyChangedEventHandler PropertyChanged;
4
5 protected void RaisePropertyChanged<T>(
6 Expression<Func<T>> propertyExpresssion)
7 {
8 if (propertyExpresssion == null)
9 {
10 throw new ArgumentNullException("propertyExpression");
11 }
12
13 var memberExpression = propertyExpresssion.Body as MemberExpression;
14 if (memberExpression == null)
15 {
16 throw new ArgumentException("PropertySupport_NotMemberAccessExpression_Exception", "propertyExpression");
17 }
18
19 var property = memberExpression.Member as PropertyInfo;
20 if (property == null)
21 {
22 throw new ArgumentException("PropertySupport_ExpressionNotProperty_Exception", "propertyExpression");
23 }
24
25 string propertyName = property.Name;
26 object propertyValue = property.GetValue(this, null);
27
28 var getMethod = property.GetGetMethod(true);
29 if (getMethod.IsStatic)
30 {
31 throw new ArgumentException("PropertySupport_StaticExpression_Exception", "propertyExpression");
32 }
33 this.RaisePropertyChanged(propertyName);
34 }
35
36 private void RaisePropertyChanged(string propertyName)
37 {
38 if (PropertyChanged != null)
39 PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
40 }
41 }
2 {
3 public event PropertyChangedEventHandler PropertyChanged;
4
5 protected void RaisePropertyChanged<T>(
6 Expression<Func<T>> propertyExpresssion)
7 {
8 if (propertyExpresssion == null)
9 {
10 throw new ArgumentNullException("propertyExpression");
11 }
12
13 var memberExpression = propertyExpresssion.Body as MemberExpression;
14 if (memberExpression == null)
15 {
16 throw new ArgumentException("PropertySupport_NotMemberAccessExpression_Exception", "propertyExpression");
17 }
18
19 var property = memberExpression.Member as PropertyInfo;
20 if (property == null)
21 {
22 throw new ArgumentException("PropertySupport_ExpressionNotProperty_Exception", "propertyExpression");
23 }
24
25 string propertyName = property.Name;
26 object propertyValue = property.GetValue(this, null);
27
28 var getMethod = property.GetGetMethod(true);
29 if (getMethod.IsStatic)
30 {
31 throw new ArgumentException("PropertySupport_StaticExpression_Exception", "propertyExpression");
32 }
33 this.RaisePropertyChanged(propertyName);
34 }
35
36 private void RaisePropertyChanged(string propertyName)
37 {
38 if (PropertyChanged != null)
39 PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
40 }
41 }
说明:abstract 是为了其他人不能直接初始化该类。
2、Example
View Code
1 public class User : BaseNotifyPropertyChanged
2 {
3 private string name;
4 public string Name
5 {
6 get { return name; }
7 set
8 {
9 name = value;
10 RaisePropertyChanged(() => this.Name);
11 }
12 }
13 }
2 {
3 private string name;
4 public string Name
5 {
6 get { return name; }
7 set
8 {
9 name = value;
10 RaisePropertyChanged(() => this.Name);
11 }
12 }
13 }
So is easy