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
        }
    全部代码
  • 相关阅读:
    BZOJ 1202: [HNOI2005]狡猾的商人( 差分约束 )
    BZOJ 1800: [Ahoi2009]fly 飞行棋( 枚举 )
    BZOJ 2006: [NOI2010]超级钢琴( RMQ + 堆 )
    BZOJ 1029: [JSOI2007]建筑抢修( 贪心 )
    FZU 2233 ~APTX4869 贪心+并查集
    FZU2232 炉石传说 最大匹配
    FZU 2237 中位数 主席树 树上k大
    CodeForcesGym 100753B Bounty Hunter II 二分图最小路径覆盖
    NOIP2010关押罪犯 二分+二染色
    POJ2236 Wireless Network 并查集
  • 原文地址:https://www.cnblogs.com/nov5026/p/5463753.html
Copyright © 2011-2022 走看看