Nel mio programma di fatturazione ho incorporato una
classe creata da me davvero utile. Vorrei farlo diventare un bel componente
da droppare sulla Windows Forms. Si tratta in pratica di una classe che
incorpora tutta la logica necessaria ad aggiungere le funzioni di Redo ed Undo. Lavora a stretto contatto con il data-binding
tra un business object ed i controlli di una Windows Form, passando da un
BindingSource opportuno.
La particolarità è che il business object deve implementare l'interfaccia
IMementoConsumer, che come descrivevo qua richiede l'implementazione di due
metodi SetMemento e CreateMemento.
public interface IMementoConsumer
{
void SetMemento(Memento m);
Memento CreateMemento();
}
Il costruttore della mia classe è questo:
public BindingHistoryManager(BindingSource BindingSource)
{
_bindingSource = BindingSource;
_businessObject = (IMementoConsumer)_bindingSource.DataSource;
_bindingComplete = true;
}
Il BindingHistoryManager lavora con il BindingSource, con il
business object impostato nel corrispondente DataSource. Notare il casting
diretto all'interfaccia IMementoConsumer, che è un vincolo necessario. Per tutto
il ciclo di vita della mia classe, mantendo un riferimento al business object.
Quando si scatena l'evento CurrentItemChanged del
BindingSource, non faccio altro che usare il BindingHistoryManager per
memorizzare un memento del business object. Sul form il codice è scarso, pulito
e molto logico:
private void srcBS_CurrentItemChanged(object sender, EventArgs e)
{
_history.Add(_history.CreateMemento());
}
La chiamata al metodo CreateMemento viene delegata al
business object che, come detto sopra, deve implementare l'interfaccia corretta.
Stessa logica per gli undo e i restore. All'interno di BindingHistoryManager, il
metodo SetPreviousManager è implementato come segue:
public void SetPreviousMemento()
{
if (_historyPosition == 0) return;
Memento m = this[--_historyPosition];
_bindingComplete = false;
_businessObject.SetMemento(m);
_bindingSource.ResetCurrentItem();
_bindingComplete = true;
}
Mi piacerebbe rendere disponibile questo mio piccolo lavoretto: se
lavorate con business object e data-binding a stretto contatto, secondo me
può essere davvero utile! Devo solo controllare che funzioni anche con controlli
più particolari (ComboBox, DateTimePicker, etc.), e poi siamo a posto.
powered by IMHO 1.3