代码之家  ›  专栏  ›  技术社区  ›  Sinaesthetic

c#:为对象的字段值更改时创建事件

  •  7
  • Sinaesthetic  · 技术社区  · 14 年前

    嘿,伙计们,有没有办法创建一个事件,当一个对象的属性/字段值改变时会触发它?例如,如果对象有一个名为

    private int number;
    

    用户执行一个更新该数字的操作,触发一个更新表单上所有文本框以显示当前字段值的事件?

    很抱歉,已为每个字段创建了“是”属性

    4 回复  |  直到 14 年前
        1
  •  20
  •   Thomas Levesque    14 年前

    使其成为属性而不是字段,并实现 INotifyPropertyChanged 在你们班上:

    class YourClass : INotifyPropertyChanged
    {
    
        private int _number;
        public int Number
        {
            get { return _number; }
            private set
            {
                _number = value;
                OnPropertyChanged("Number");
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
                handler(this, new PropertyChangedEventArgs(propertyName));
        }
    
    }
    

    PropertyChanged 事件,或使用将自动处理它的数据绑定

        2
  •  2
  •   wh1t3cat1k    14 年前

    您应该使用用户定义的getter和setter(即属性)手动触发事件。看这段代码,应该很简单:

    // We declare a delegate to handle our event
    
    delegate void StateChangedEventHandler(object sender, StateChangedEventArgs e);
    
    // We declare event arguments class to specify, which value has changed to which value.
    
    public class StateChangedEventArgs: EventArgs
    {
        string propertyName;
    
        object oldValue;
        object newValue;
    
        /// <summary>
        /// This is a constructor.
        /// </summary>
        public StateChangedEventArgs(string propertyName, object oldValue, object newValue)
        {
            this.propertyName = propertyName;
    
            this.oldValue = oldValue;
            this.newValue = newValue;
        }
    }
    
    /// <summary>
    /// Our class that we wish to notify of state changes.
    /// </summary>
    public class Widget
    {
        private int x;
    
        public event StateChangedEventHandler StateChanged;
    
        // That is the user-defined property that fires the event manually;
    
        public int Widget_X
        {
            get { return x; }
            set
            {
                if (x != value)
                {
                    int oldX = x;
                    x = value;
    
                    // The golden string which fires the event:
                    if(StateChanged != null) StateChanged.Invoke(this, new StateChangedEventArgs("x", oldX, x);
                }
            }
        }
    }
    

    • 他们得到了 x
    • 他们设置了 变量的值与以前的值相同。无事可做。我们在设定器里面检查。
    • 他们设置了

    在调用事件之前,检查是否注册了任何事件处理程序(即,我们的事件不为空)是非常重要的。在其他情况下,我们会得到一个例外。

        3
  •  1
  •   Ozzy    14 年前

    听起来你应该看看 INotifyPropertyChanged 接口。但它不适用于字段,您必须手动实现它。

        4
  •  0
  •   Gerrie Schenck    14 年前

    你打算在哪里用这个?

    如果你要在客户端应用程序中使用这个 implementing INotifyPropertyChanged 是推荐的工作方式。