M-V-VM e la verbosità: che barba… che noia… :-)
Traffico e rumore
Il problema è che in una applicazione desktop si ha il rischio che una singola View esponga molte funzionalità all’utente e si ha il rischio che queste funzionalità girino intorno allo stesso contesto e quindi vengano tutte implementate/esposte dallo stesso ViewModel.
Un esempio, triviale:
Un banalissimo ViewModel che espone un command, spesso però succede che i ViewModel devono essere trattati anche direttamente da codice e non solo via Wpf Binding, ergo si evolve verso questo:interface ISampleViewModel { String Text { get; set; } Int64 Result { get; } ICommand SaveCommand { get; } }
Perchè “fa brutto” accedere direttamente al Command, aggiungendo però un po’ troppo rumore per i miei gusti.interface ISampleViewModel { String Text { get; set; } Int64 Result { get; } ICommand SaveCommand { get; } Boolean CanSave { get; } void Save(); }
Cosa serve?
A questo punto la domanda giusta è: ma cosa serve e a chi?
Una risposta possibile è che il Command a noi proprio non serve, serve solo ed esclusivamente a Wpf e al suo fantastico mondo.
Possiamo farne a meno?
Perchè no :-). Pensiamo ad un ViewModel fatto così:
e ad una View cosà :-):interface ISampleViewModel { String Text { get; set; } Int64 Result { get; } Fact CanSave { get; } void Save(); }
A parte quel Fact quale è la differenza sostanziale? Non c’è più il command che, IMHO, a noi non serve ad una cippa :-)<Button Command="{cmd:AutoCommandBinding Path=SaveCommand}">My Save ButtonButton>
ndr: il nome Fact è ereditato da un vecchio post da Ayende ma l’unica cosa che eredita è il nome :-)To be continued…
.m