views:

64

answers:

2

How is data binding in C# WinForms supposed to work when you have a Save button? I don't want the data updated until I press Save!

I have two forms (list and detail) backed by a BindingList<T> collection and my custom object from that collection, respectively. I can bind each form to the list or object appropriately. However, any changes made in the detail form are immediately reflected in the list form - I don't want to save the changes and update the details shown in the list until the Save button is pressed.

Is data binding designed to support this? Is there a common pattern for doing so?

Whichever way I look at it, binding doesn't seem to be able to support this scenario. I've considered the following:

  • Pass a clone of the object to the detail form, but then I have to reconcile the changes on Save - changes may have been made to the copy in the list in the meantime.

  • Implementing IEditableObject and calling EndEdit on save almost works as I can prevent the list being notified of the changes made until Save is pressed, but if something else causes a refresh the list is updated with the interim data.

I'm currently left with dispensing with data binding in my detail view, and doing it all manually. Which is rather annoying.

+2  A: 

Data binding really wasn't designed for this kind of thing, unfortunately.

The best solution we've found here is to edit object clones, then reconcile the changes, as you mentioned. You may want to come up with a custom collection and/or object interface that helps you manage this type of thing.

Even if the cloning method is slightly more work up front, it's going to be wayyyy less complicated and frustrating than using IEditableObject trying to catch all the possible events that update the data. Not only that, it's a more straightforward approach, and you won't end up with spaghetti code.

Jon Seigel
A: 

If you are set on using a binding list, your best bet would be to implement IBindingList to create the functionality that you desire. It may also be possible to pull this off by simply inheriting from BindingList and overriding the appropriate methods to change the binding list's behavior.

http://msdn.microsoft.com/en-us/library/system.componentmodel.ibindinglist.aspx

If you are not set on using a binding list, it is probably best to do the data manipulations manually based off of the control's events.

Best of luck.