Pattern M-V-VM e facce della mamma
Per scrivere questo post ho bisogno di un piccolo preambolo tecnico.
Sto sviluppando un’applicazione Silverlight 4, facente uso dei RIA Services per l’accesso ai dati. Un po’ perchè sono nuovo di Silverlight, un po’ perchè comunque perchè non si finisce mai di imparare, questa mattina mi sono ritrovato a dover affrontare una nuova problematica che non sapevo bene come gestire.
La prima cosa che faccio in questi casi è partire da zero, se possibile: creo una nuova applicazione per isolare e studiare il problema a parte, poi lo isolo e pian piano lo caccio dentro (termine tecnico) l’applicazione vera che sto sviluppando. Così ho fatto questa mattina.
Quindi, nuova applicazione Silverlight 4, creo una classe BaseViewModel con il minimo indispensabile, poi un MainViewModel che eredita e via dicendo. Disegno quello che devo disegnare, imposto il DataContext, un po’ di TextBlock bindate a proprietà del ViewModel, ed un bel Button bindato ad una proprietà di tipo RelayCommand. Avvio il progetto, vedo i dati nella ListBox, quando seleziono un oggetto si popolano tutte le TextBlock.
Poi clicco sul pulsante e…boom…non succede nulla. Clicco e ri-clicco e non succede nulla. Controllo di qua e controllo di là : il pulsante non sembra scatenare l’execute del comando. E’ così che – tra le altre cose – arrivo all’ora di pranzo.
Scendo per pranzo verso le 12:30, pensieroso e con la faccia scura perchè – nonostante abbia di fronte un piatto di penne al ragù – continuo a pensare al problema. “Cavolo, l’ho già fatto un centinaio di volte ormai, perchè quel pulsante non va?â€.
Ed è qui dove arriva la mamma che quando mi sente silenzioso e mi vede preoccupato, capisce subito che c’è qualcosa che non va. E cerco di spiegarle che non è nulla di serio, è solo un bottone che non ne vuol sapere di fare il suo sporco lavoro. E mentre mangio continuo a pensarci.
Mumble mumble.
Finito il pranzo, torno su e rimetto mano al codice. E con lo stomaco pieno si ragiona sempre meglio, ed ecco infatti che arriva la soluzione: vero che il bottone era correttamente bindato ad una proprietà di tipo RelayCommand del ViewModel, peccato però che la classe RelayCommand non stesse ereditando da ICommand, e quindi di fatto non c’era un vero comando associato al bottone.
Finale.
Ore 16:00 : sale mia madre in mansarda ad annaffiare la pianta grassa che c’è vicino al mio monitor e – premurosa – mi chiede: “Come va? Hai risolto quel problema?†E io bello tranquillo: “Sì sì, certo, il fatto è che il bottone ereditava giusto il DataContext dallo UserControl, la proprietà Command era bindata giusta, ma mi ero dimenticato di mettere nel codice il fatto che classe RelayCommand deve ereditare da ICommand.â€, come stessi parlando con Omar o con un collega!
Insomma, avreste dovuto vedere che faccia ha fatto, manco avessi parlato aramaico antico!!!
Mamma, ti voglio bene!