• 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
        }
    全部代码
  • 相关阅读:
    神通广大的CSS3选择器
    CF1153E Serval and Snake【构造】
    CF1153F Serval and Bonus Problem 【期望】
    李超线段树学习笔记
    Luogu5327【ZJOI2019】语言【树上差分,线段树合并】
    Luogu4191 [CTSC2010]性能优化【多项式,循环卷积】
    Codeforces Round #564 比赛总结
    CF917D Stranger Trees【矩阵树定理,高斯消元】
    【CTS2019】珍珠【生成函数,二项式反演】
    斯特林数学习笔记
  • 原文地址:https://www.cnblogs.com/nov5026/p/5463753.html
Copyright © 2020-2023  润新知