使用继承简化INotifyPropertyChanged接口的实现

  传统使用INotifyPropertyChanged的方式如下:

  

public event PropertyChangedEventHandler PropertyChanged;

private String _Id;
/// <summary>
/// 编号
/// </summary>    
public String Id
{
get { return _Id; }
set
{
_Id = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Id"));
}
}
}

  存在2个问题:

  1.PropertyChanged(this, new PropertyChangedEventArgs("Id"));是硬编码,属于高耦合。

  2.代码太TM繁琐了,写的累死,就是用T4模板生成,这么多看着也累。

  在网上找了下,整理了一下方法,就是利用继承,写一个基类。具体代码

  

 public class PropertyChangedBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public void NotifyPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

    public static class PropertyChangedBaseEx
    {
        public static void NotifyPropertyChanged<T, TProperty>(this T propertyChangedBase,
          Expression<Func<T, TProperty>> expression) where T : PropertyChangedBase
        {
            var memberExpression = expression.Body as MemberExpression;
            if (memberExpression != null)
            {
                string propertyName = memberExpression.Member.Name;
                propertyChangedBase.NotifyPropertyChanged(propertyName);
            }
            else
                throw new NotImplementedException();
        }
    }

调用方式如下

public class Account : PropertyChangedBase
    {
        private int _Id;
        /// <summary>
        /// 编号
        /// </summary>
        public Int32 Id
        {
            get { return _Id; }
            set { _Id = value; this.NotifyPropertyChanged(p => p.Id); }
        }
    }

这样相对来说个人觉得已经可以了,代码简单,也去掉了硬编码。

 

posted @ 2015-06-30 15:09  陌路黄泉  阅读(634)  评论(0编辑  收藏  举报