title: Lists NotifyPropertyChanging
body: <p>Well BindingList and ObservableCollection work great to keep data updated and to notify when one of it's objects has changed. However, when notifying a property is about to change, I think these options are not very good.</p>
  
  <p>What I have to do right now to solve this (and I warn this is not elegant AT ALL), is to implement INotifyPropertyChanging on the list's type object and then tie that to the object that holds the list PropertyChanging event, or something like the following:</p>
  
  <pre><code>// this object will be the type of the BindingList
  public class SomeObject : INotifyPropertyChanging, INotifyPropertyChanged
  {
      private int _intProperty = 0;
      private string _strProperty = String.Empty;
  
      public int IntProperty
      {
          get { return this._intProperty; }
          set
          {
              if (this._intProperty != value)
              {
                  NotifyPropertyChanging("IntProperty");
                  this._intProperty = value;
                  NotifyPropertyChanged("IntProperty");
              }
          }
      }
  
      public string StrProperty
      {
          get { return this._strProperty; }
          set
          {
              if (this._strProperty != value)
              {
                  NotifyPropertyChanging("StrProperty");
                  this._strProperty = value;
                  NotifyPropertyChanged("StrProperty");
              }
          }
      }
  
      #region INotifyPropertyChanging Members
  
      public event PropertyChangingEventHandler PropertyChanging;
  
      #endregion
  
      #region INotifyPropertyChanged Members
  
      public event PropertyChangedEventHandler PropertyChanged;
  
      #endregion
  
      public void NotifyPropertyChanging(string propertyName)
      {
          if (this.PropertyChanging != null)
              PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
      }
  
      public void NotifyPropertyChanged(string propertyName)
      {
          if (this.PropertyChanged != null)
              PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
      }
  }
  
  public class ObjectThatHoldsTheList : INotifyPropertyChanging, INotifyPropertyChanged
  {
      public BindingList&lt;SomeObject&gt; BindingList { get; set; }
  
      public ObjectThatHoldsTheList()
      {
          this.BindingList = new BindingList&lt;SomeObject&gt;();
      }
  
      // this helps notifie Changing and Changed on Add
      private void AddItem(SomeObject someObject)
      {
          // this will tie the PropertyChanging and PropertyChanged events of SomeObject to this object
          // so it gets notifies because the BindingList does not notify PropertyCHANGING
          someObject.PropertyChanging += new PropertyChangingEventHandler(someObject_PropertyChanging);
          someObject.PropertyChanged += new PropertyChangedEventHandler(someObject_PropertyChanged);
  
          this.NotifyPropertyChanging("BindingList");
          this.BindingList.Add(someObject);
          this.NotifyPropertyChanged("BindingList");
      }
  
      // this helps notifies Changing and Changed on Delete
      private void DeleteItem(SomeObject someObject)
      {
          if (this.BindingList.IndexOf(someObject) &gt; 0)
          {
              // this unlinks the handlers so the garbage collector can clear the objects
              someObject.PropertyChanging -= new PropertyChangingEventHandler(someObject_PropertyChanging);
              someObject.PropertyChanged -= new PropertyChangedEventHandler(someObject_PropertyChanged);
          }
  
          this.NotifyPropertyChanging("BindingList");
          this.BindingList.Remove(someObject);
          this.NotifyPropertyChanged("BindingList");
      }
  
      // this notifies an item in the list is about to change
      void someObject_PropertyChanging(object sender, PropertyChangingEventArgs e)
      {
          NotifyPropertyChanging("BindingList." + e.PropertyName);
      }
  
      // this notifies an item in the list has changed
      void someObject_PropertyChanged(object sender, PropertyChangedEventArgs e)
      {
          NotifyPropertyChanged("BindingList." + e.PropertyName);
      }
  
      #region INotifyPropertyChanging Members
  
      public event PropertyChangingEventHandler PropertyChanging;
  
      #endregion
  
      #region INotifyPropertyChanged Members
  
      public event PropertyChangedEventHandler PropertyChanged;
  
      #endregion
  
      public void NotifyPropertyChanging(string propertyName)
      {
          if (this.PropertyChanging != null)
              PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
      }
  
      public void NotifyPropertyChanged(string propertyName)
      {
          if (this.PropertyChanged != null)
              PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
      }
  }
  </code></pre>
  
  <p>Sorry, I know this is a lot of code, which takes me back to my main point IT'S A LOT OF CODE to implement this. So my question is, does anyone know a better, shorter, more elegant solution?</p>
  
  <p>Thanks for your time and suggestions.</p>