Command Binding in Windows Presentation Foundation (con screencast)

WPF fornisce supporto integrato per i comandi, permettendo di associare a ciascuno di essi una funzione di risposta alle principali azioni che su di essi si possono compiere; per comandi si intende quelle operazioni classiche di Windows quali Copy, Paste, AlignRight, Close, Open, Undo, ScrollDown, PreviousTrack ed un altro centinaio, che WPF raggruppa in cinque classi: ApplicationCommands, ComponentCommands, MediaCommands, NavigationCommands ed EditingCommands, di cui trovate ampia documentazione su MSDN e in generale sulla rete.

Le "principali azioni" relative ai comandi sono tre: 1) la loro esecuzione, 2) la verifica sul fatto che possano essere effettivamente eseguite e 3) la notifica dello stato di cambiamento della loro disponibilità; per fare un esempio, la funzione incolla prevede come esecuzione l'estrazione dell'informazione dalla clipboard e la sua scrittura nell'elemento di destinazione (es. una TextBox), prevede come verifica il fatto che esista un'informazione in clipboard e come notifica il fatto che la clipboard passi da vuota a piena o viceversa; in questo modo posso utilizzare le tre funzioni per abilitare o disabilitare un bottone che ne implementa il comportamento.

Una volta associato il comando ai nomi delle tre funzioni di risposta (per la precisione questa operazione si chiama CommandBinding), è possibile sfruttare un altro potente servizio offerto da WPF per legare il comando ad un controllo che può essere di tipo Button, CheckBox o MenuItem; da quel momento, premere il bottone richiamerà la funzione designata alla esecuzione, e la proprietà IsEnabled dello stesso sarà automaticamente legata al risultato della funzione di verifica. In più, se il comando prevede una combinazione di tastiera (come il CTRL-V per la funzione Incolla), digitando la stessa otteniamo gratis il biding dello shortcut alla funzione di esecuzione, esattamente come se avessimo premuto il bottone ad essa riferito.

 

Non vi ho convinto? In effetti, per chi proviene come me da esperienza di programmazione procedurale, risulta a volte difficile percepire il vantaggio di un sistema -come WPF- che fornisce già integrato il supporto per operazioni che siamo sempre stati finora abituati a gestire manualmente: che problema c'è? - mi sono chiesto la prima volta che ho studiato questo argomento - basta scrivere l'operazione nella funzione di risposta al click del bottone

Per meglio rendermi conto della differenza ho provato ad implementare la funzione incolla in modo tradizionale e poi sono passato al command binding di WPF, e devo confessarvi che mi sono ricreduto: quasi per magia (il mio collega e amico Dario Airoldi , scherzando, mi ha chiamato Silvan quando ha visto la mia piccola demo :-)), continuavo a rimuovere decine di righe di codice che avevo scritto fino a scendere a zero istruzioni C# e due soli attributi del bottone in XAML, e il programma continuava a funzionare anche meglio di prima (per esempio, potevo evitare di monitorare  lo stato della clipboard con un timer)!

In effetti, riflettendoci bisogna ammettere che è quasi imbarazzante che io spieghi a Windows che quando premo CTRL-V lui deve andare a prendere il contenuto della clipboard e scriverlo nel controllo con il focus: dovrei solo potergli dire incolla! e poi saprà ben lui come fare, non vi pare?

 

Se vi ho incuriosito a sufficienza, potete guardarvi lo screencast del mio test che ho descritto sopra, che ho registrato in modo amatoriale (dovrete alzare un po' il volume, ed è sicuramente migliorabile) per il mio archivio personale ma che credo possa aiutare nella comprensione di questo argomento.

Vi auguro buona visione. Alla prossima