Lists NotifyPropertyChanging

Posted by Carlo on Stack Overflow See other posts from Stack Overflow or by Carlo
Published on 2009-05-26T21:27:08Z Indexed on 2010/04/03 7:03 UTC
Read the original article Hit count: 585

Filed under:
|

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.

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:

// 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<SomeObject> BindingList { get; set; }

	public ObjectThatHoldsTheList()
	{
		this.BindingList = new BindingList<SomeObject>();
	}

	// 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) > 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));
	}
}

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?

Thanks for your time and suggestions.

© Stack Overflow or respective owner

Related posts about c#

Related posts about collections