【问题标题】:Creating Events for change in some property value which is user defined创建事件以更改用户定义的某些属性值
【发布时间】:2010-02-02 22:08:38
【问题描述】:

我正在创建一个自定义控件,我想在其中添加一些属性。 在少数几个属性上,我想创建一些events。 说 如果我有财产

public int Date {get; set;}

现在如果它的值正在改变,我想触发一个改变事件。所以我怎么能在这个上添加事件

【问题讨论】:

    标签: c# .net oop events event-handling


    【解决方案1】:

    使用“普通”属性而不是自动属性,并在 setter 中引发更改事件:

    private int _date;
    
    public int Date
    {
      get { return _date; }
      set
      {
        if (value != _date)
        {
          _date = value;
          // raise change event here
        }
      }
    }
    

    要引发更改事件,如果这是标准的 INotifyPropertyChanged.PropertyChanged 事件:

    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null)
    {
      handler(this, new PropertyChangedEventArgs("Date");
    }
    

    建议将其隔离到 OnPropertyChanged 方法中。

    如果您要引发自定义 DateChanged 事件,逻辑将相似,但名称和事件参数不同。

    【讨论】:

      【解决方案2】:

      执行此操作的典型模式如下:

      // declare the event
      public event EventHandler DateChanged;
      
      // declare backing field for the property
      private int _date;
      
      public int Date
      {
          get { return _date; }
          set
          {
              // bool indicating whether the new value is indeed 
              // different from the old one
              bool raiseEvent = _date != value;
              // assign the value to the backing field
              _date = value;
              // raise the event if the value has changed
              if (raiseEvent)
              {
                  OnDateChanged(EventArgs.Empty);
              }
          }
      }
      
      protected virtual void OnDateChanged(EventArgs e)
      {
          EventHandler temp = this.DateChanged;
          // make sure that there is an event handler attached
          if (temp != null)
          {
              temp(this, e);
          }
      }
      

      此示例显示了 PropertyChanged 事件的实现。对于 PropertyChanging 事件,它是同样的事情,但您在属性集访问器中分配值之前 引发事件。

      【讨论】:

        【解决方案3】:

        嗯,你首先需要定义你的事件,以及一个引发它的方法。

        那么你需要从一个自动实现的属性中切换出来

        private int _date;
        public int Date
        {
            get {return _date;}
            set
            {
                if(!_date.Equals(value))
                    //Raise event here
        
                _date = value;
            }
        }
        

        如果您在活动部分需要一些帮助,请here is a tutorial 我写信给您详细信息。

        【讨论】:

          【解决方案4】:

          您还可以实现 INotifyPropertyChanged interface 并在您的属性设置器中引发一个事件,这里是您可以使用和玩的完整代码示例:

          using System;
          using System.Collections.Generic;
          using System.Linq;
          using System.Text;
          using System.ComponentModel;
          
          namespace ConsoleApplication1
          {
              class Foo : INotifyPropertyChanged
              {
                  private object myProperty;
                  public event PropertyChangedEventHandler PropertyChanged;
          
                  protected virtual void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
                  {
                      if (PropertyChanged != null)
                      {
                          PropertyChanged(sender, e);
                      }
                  }
          
                  public object MyProperty
                  {
                      get { return this.myProperty;}
                      set
                      {
                          if (this.myProperty != value)
                          {
                              this.myProperty = value;
                              this.OnPropertyChanged(this, new PropertyChangedEventArgs("MyPropery"));
                          }
                      }
                  }
              }
          
              class Program
              {
                  static void Main(string[] args)
                  {
                      Foo foo = new Foo();
                      foo.PropertyChanged += new PropertyChangedEventHandler(foo_PropertyChanged);
          
                      foo.MyProperty = "test";
                  }
          
                  static void foo_PropertyChanged(object sender, PropertyChangedEventArgs e)
                  {
                      Console.WriteLine("raised");
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2012-03-27
            • 1970-01-01
            • 2011-04-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多