You're probably looking for BufferedValueModel
:
A ValueModel that wraps another ValueModel, the subject, and delays changes of the subject's value. Returns the subject's value until a value has been set. The buffered value is not written to the subject until the trigger channel changes to Boolean.TRUE.
PresentationModel.getBufferedValue()
is useful for creating them.
However, generally I would avoid buffered models, because it adds additional complexity to an architectural model that is already fairly complex. Also, it doesn't work well with model validation. I would recommend leaving the auto-commit behavior of the bindings alone, and structure your code around it.
Karsten Lentzsch on buffering:
I personally prefer to buffer by copying the domain object graph.
In many applications, the domain objects on the client are
copies of back end domain objects. In this case you can operate
on the client domain objects without any further buffering.
To flush all changes made on the client domain objects
you can just reload them from the back end.
Anyway, if you want buffer at the Presentation Model (PM) layer,
you should make it available in the PM. Your presentation logic
then operates on the buffered state, not on the domain state.
You can find an example in the Binding tutorial. See the
BufferedAlbumPresentationModel. It demonstrates how to
listen to changes in the buffered "classical" property
to update the buffered "composerEnabled" property.
Note that the BufferedClassicalChangeHandler copies
behavior implemented in Album#setClassical that sets
the composer to null if the album is not classical.
You can find the tutorial in the older packages in the JGoodies download archive.