zoukankan      html  css  js  c++  java
  • WPFINotifyPropertyChanged使用技巧

    WPFINotifyPropertyChanged使用技巧

    public class NotifyPropertyChanged : INotifyPropertyChanged
    {
    public event PropertyChangedEventHandler PropertyChanged;
    
    public void NotifyChanged(string propertyName)
    {
    if (PropertyChanged != null)
    {
    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
    }
    传统使用方法

    这种方式称之为一般的实现方式, 因为它确实是太普通不过了, 而且使用起来也让人感到厌恶, 因为必须指定手工指定属性名称:如需要实现的属性过多,

    则指定属性名是非常繁琐,无聊,容易出错,并且会使代码累赘。

    于是通过另一种方式减少代码输入(本质就是传递当前发生改变属性的名称):

      #region 引发指定属性更改事件
            /// <summary> 
            /// 引发指定属性更改事件 
            /// </summary> 
            public virtual void RaisePropertyChanged()
            {
                /* 
                * 1.取当前调用堆栈的上一个方法(一般为属性内部的SetMethod) 
                * 2.目前CLR对属性SetMethod方法的命名规则为“set_” + 属性名 
                * 3.只要CLR依旧保持着这个命名规则,我们就可以自动忽略参数了 
                */
                var stack = new StackTrace();
                var lastFrame = stack.GetFrame(1);
                var methodName = lastFrame.GetMethod().Name;
    
                var propertyName = methodName.Substring(methodName.LastIndexOf('_') + 1);
                this.NotifyChanged(propertyName);
            } 
            #endregion
    简单实现方式
     /// <summary>
        /// 实现INotifyPropertyChanged 向客户端发出某一属性值已更改的通知
        /// </summary>
        [SerializableAttribute]
        public class NotifyPropertyChanged : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
    
            public void NotifyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
    
    
            #region 引发指定属性更改事件
            /// <summary> 
            /// 引发指定属性更改事件 
            /// </summary> 
            public virtual void RaisePropertyChanged()
            {
                /* 
                * 1.取当前调用堆栈的上一个方法(一般为属性内部的SetMethod) 
                * 2.目前CLR对属性SetMethod方法的命名规则为“set_” + 属性名 
                * 3.只要CLR依旧保持着这个命名规则,我们就可以自动忽略参数了 
                */
                var stack = new StackTrace();
                var lastFrame = stack.GetFrame(1);
                var methodName = lastFrame.GetMethod().Name;
    
                var propertyName = methodName.Substring(methodName.LastIndexOf('_') + 1);
                this.NotifyChanged(propertyName);
            } 
            #endregion
        }
    全部代码
  • 相关阅读:
    2.搭建第一个http服务:三层架构
    1.基础入门
    MyISAM和InnoDB索引区别
    分区
    事务的四大特性
    事务
    String
    自己写native方法
    序列化和反序列化
    反射
  • 原文地址:https://www.cnblogs.com/nov5026/p/5463753.html
Copyright © 2011-2022 走看看