SlideShare a Scribd company logo
MODEL VIEW VIEWMODEL
Silverlight Version

Mauro Servienti
Senior Software Architect @ Gaia S.r.l.
Microsoft MVP – Visual C# / MCTS

mauro.servienti@gaia.is.it
http://milestone.topics.it
Agenda
• Part I

  • Waiting for Model View ViewModel;


  • Required & Missing Concepts;


  • Model View ViewModel Deep Dive;



• Part II

  • Facciamolo!
WAITING...
Model View ViewModel Primer
Mumble...mumble... (upfront)
• È difficile?  parecchio... :-)
  • Siamo troppo abituati al «coupling» tra componenti visuali e logica


• Quindi...il gioco vale la candela?
  • Tutta la vita, in particolare al crescere dall’applicazione:
     • Sia verticalmente: complessità;
     • Sia orizzontalmente: versioning nel tempo;



• C’è rischio di addiction? «Purtroppo» si :-)
  • Una volta che ci avete preso la mano scrivereste anche il notepad
    con M-V-VM;
Why?... pecccchè?
• Perchè adottare un pattern per la presentazione dei dati?


• SoC e SPoR sono sicuramente due buonissimi motivi:
  • Diamo un boost alla manutenibilità liberandoci dello spaghetti code;


• Cerchiamo di separare nettamente le figure coinvolte:
  • Il designer non è il developer e il devloper non è il designer;
  • Non necessariamente sono figure fisicamente diverse, ma
    sicuramente sono momenti diversi;


• Introduciamo la possibilità di testare il comportamento
 della logica che gestisce la UI;
Talebani o Libertini?
• Dogma: Un pattern è un pattern quindi va sempre
 adattato al contesto in cui viene calato;

• Model View ViewModel però...:
  • Nella sua implementazione con Wpf/Sl è giovane;
  • Molte cose sono decisamente borderline;
  • Il contesto d’uso classico, un rich client, lo rende complesso da
    applicare perchè le celte da fare sono moltissime:
     • MVC con Asp.net ha decisamente poca libertà di manovra per come è
       fatto http;
     • MVP con WinForms è molto limitato dalle limitazioni di WinForms;


• All’inizio essere un po’ talebani aiuta a pensare;
REQUIREMENTS
Silverlight/Wpf required concepts
DATABINDING
Overview
    DependencyObject                         POCO Instance
    Tipicamente la UI                        I nostri dati

       Dependency                                  CLR
                        Binding Expression
        Property                                 Property




• La BindingSource può essere una qualsiasi
  istanza, senza nessun requisito;
• Il BindingTarget deve essere una Dependency
  Property, e quindi un l'istanza di un Dependency
  Object;
DataFlow Direction
     DependencyObject                                   POCO Instance
          Dependency                                   CLR
                                     - OneWay
           Property                                  Property
                                     - TwoWay
                                     - OneWayToSource

• OneWay: il binding è monodirezionale:
  • da Source verso Target;
  • è il default per controlli i read-only (eg. TextBlock);
• TwoWay: il binding è bidirezionale:
   • I dati viaggiano da Source verso Target e viceversa;
   • È il default per tutti controlli r/w (eg. TextBox)
• OneTime: il binding viene valuato una sola valta:
  • da Source verso Target;
Data «Triggers»
• Cosa causa il pull/push dei dati?
  • Source (data)  Target (UI):
    • OneWay e TwoWay: la source deve implementare un motore di notifica
      come ad esempio INotifyPropertyChanged;
    • Nel caso di collection la collection deve supportare la notifica delle
      variazioni interne... More to come;
  • Target (UI)  Source (data):
    • TwoWay e OneWayToSource:
       • «Default»: predefinito, la source viene aggiornata nel momento in cui il
         controllo corrente perde il focus;
       • «PropertyChanged»: la Source è aggiornata ad ogni variazione della
         proprietà del target;
       • «Explicit»: la source viene aggiornata solo su richiesta esplicita:
         BindingExpression.UpdateSource();
Xaml everywhere
<StackPanel>
 <StackPanel.Resources>
     <SomeResourceHere x:Key="myRes"/>
 </StackPanel.Resources>
<StackPanel.DataContext>
 <Binding Source="{StaticResource myRes}"/>
</StackPanel.DataContext>
 <TextBlock
   Text="{Binding Path=PropName}" />
</StackPanel>
Da WinForms a *.DataContext
• In Windows Forms era responsabilità di ogni singolo
 controllo esporre un sistema per il data binding:
  • .DataSource;
  • .SetDataBinding(...);
  • TextBox.????;
• FrameworkElement espone DataContext:
  • Razionalizza e uniforma l'approccio;
  • È una Dependency Property:
    • beneficia del concetto di ereditarietà del valore;
    • Supporta a sua volta data binding;
Binding Pipeline
TextBlock                                      MyObject
                         Source  Target
       Text                                       DateTime
     Property           Target  Source           Property


       • Per impostazione predefinita il motore di binding per
        la conversione chiama ToString()
            • NB: In assenza di un template;
       • Possiamo intervenire nel processo di conversione
        scrivendo un ValueConverter
Binding Pipeline: IValueConverter
 • IValueConverter definisce solo 2 metodi:
    • Convert( ... ): viene invocato dal processo di binding nel momento
      in cui il dato si muove dalla Source verso il Target;
    • ConvertBack( ... ): viene invocato durante il passaggio
      opposto, mentre il dato viaggia dal Target verso la Source;




<TextBlock Text="{Binding
            Path=PropName,
            Converter={StaticResource myConverter}}" />
COMMANDING
Separation of Concern
• Il concetto di command in Silverlight/Wpf è basato sul
 command pattern:
  • La logica di esecuzione è independente dalla UI;
  • Incapsulare la logica di esecuzione permette di avere più entry-
   point verso quel comando


• Chi si ricorda le Action di delphi...?
L'interfaccia ICommand
• CanExecute( Object ):
  • L'invoker può sapere se il comando può essere eseguito in un
    determinato contesto;
• Execute( Object ):
  • L'invoker può invocare il comando;
• CanExecuteChanged event:
  • Il comando può notificare l'invoker di eventuali variazioni del suo
    stato;
LET’S GO
Adesso che abbiamo messo le fondamenta...
Please welcome M-V-VM




                                            presentation
                    View

                       DataBinding

                       Command




                                            engine
Il centro del     ViewModel          D.I.

   mondo!

                   Repository<T>

                    Model




                                            data
                        Adapter



                Somewhere in
                   time...
ACTORS
Actors: Model
• È uno ed uno solo:
  • Rappresenta i dati, che in quanti tali, vanno sempre protetti;



• Può essere un Object Model o un Domain Model:
  • È molto più facile che sia un «Object Model» condito da servizi;



• È responsabile della validazione statica:
  • Le regole di validazione non pertinenti al caso d’uso;



• È totalmente ignaro del mondo in cui è inserito:
  • Non implementa INotifyPropertyChanged;
Actors: ViewModel
• Rappresenta un caso d’uso del Modello:
  • È un aggregatore di logica e dati;



• È responsabile della validazione contestuale:
  • Casi d’uso diversi con regole di validazione diverse per dati uguali;



• È conscio di essere in un mondo basato su DataBinding:
  • Implementa INotifyPropertyChanged, ma non deriva da Dep.Obj;



• E’ responsabile del «flattening» del grafo:
  • Ricuce l’uso dei comodi ma scomodi converter;
Actors: View
• È «stupidamente» legata al ViewModel:
  • Non prende la benchè minima decisione;



• Deve essere a prova di designer:
  • Quindi non deve aver nessun rapporto con il codice;



• Deve poter essere disegnata:
  • Focus on the «Blendability»;
Who comes first?
• Abbiamo un duopolio...
  • ma...chi comanda?



• ViewModel first?


• View first?


• Io sono per il ViewModel first perchè vedo la View come
 una passive-view;
SEE IT LIVE!
Hands on Model View ViewModel
Recap
• Abbiamo definito il modello: Person/Address;
  • OT: Abbiamo introdotto il concetto di DataContext;


• Abbiamo costruito dei casi d’uso sul modello: ViewModel
  • Visualizzare un elenco di persone;
  • Visualizzare il dettaglio della persona selezionata;


• Abbiamo «visualizzato» i casi d’uso: View;


• Potevamo scrivere dei test prima di arrivare alla View?
• Servono ancora gli «U.A.T.»?
Q&A
do not shoot the pianist

More Related Content

PDF
Lezione 6: Remote Method Invocation
PPTX
m-v-vm @ UgiAlt.Net
PDF
Lezione 7: Remote Method Invocation e SSL
PDF
Lezione 11: Accesso ai RESTful Web Services in Java
PDF
Lezione 10: Web Service in Java (2)
PDF
Lezione 9: Web Service in Java
PPTX
Usare Knockout JS
PPTX
Javascript avanzato: sfruttare al massimo il web
Lezione 6: Remote Method Invocation
m-v-vm @ UgiAlt.Net
Lezione 7: Remote Method Invocation e SSL
Lezione 11: Accesso ai RESTful Web Services in Java
Lezione 10: Web Service in Java (2)
Lezione 9: Web Service in Java
Usare Knockout JS
Javascript avanzato: sfruttare al massimo il web

Viewers also liked (9)

PPTX
WPF 4 fun
PPTX
Writing apps for android with .net
PDF
WPF MVVM Toolkit
PPTX
UI Composition - Prism
PPTX
m-v-vm @ dotNetMarche
PDF
Iter documentale per gli iscritti alla sezione E del RUI (collaborazione con ...
PPTX
Model-View-ViewModel
PPT
Introduzione WPF
PDF
WPF MVVM Toolkit
WPF 4 fun
Writing apps for android with .net
WPF MVVM Toolkit
UI Composition - Prism
m-v-vm @ dotNetMarche
Iter documentale per gli iscritti alla sezione E del RUI (collaborazione con ...
Model-View-ViewModel
Introduzione WPF
WPF MVVM Toolkit
Ad

Similar to Silverlight m v-vm @ DotNetteria (20)

PPTX
Model-View-ViewModel con Windows Store Apps
PDF
Il pattern mvvm come strutturare al meglio il vostro progetto
PPT
WPF & LINQ: VB T&T Community After Hour @ Microsoft Days 08
PDF
PPTX
Realizzare applicazioni cross-platform con Xamarin e il pattern MVVM
PDF
Idiomatic Domain Driven Design
PPTX
Data binding for dummies - Microsoft publish 2014
PDF
Domain Driven Design e CQRS
PDF
AreaMVC: un'architettura software basata sulla semplicità
PPTX
Lo sai che si può fare DDD in Javascript grazie a Typescript? Visual Studio e...
PDF
Approccio Pratico al Domain Driven Design
PPT
Sviluppo MVVM con Android
PDF
AntiPatterns: i vizi del programmatore
PPTX
PDF
Tesi Laurea Specialistica Ingegneria Informatica. Alessandro Andreosè
PPTX
Il web 2.0
PDF
SUE AGILE MVVM (Italian)
PPTX
Inversion of Control @ CD2008
PPTX
.Net 4.0 Preview @ UGIdotNet
PDF
Slide Prelaurea. Alessandro Andreosè
Model-View-ViewModel con Windows Store Apps
Il pattern mvvm come strutturare al meglio il vostro progetto
WPF & LINQ: VB T&T Community After Hour @ Microsoft Days 08
Realizzare applicazioni cross-platform con Xamarin e il pattern MVVM
Idiomatic Domain Driven Design
Data binding for dummies - Microsoft publish 2014
Domain Driven Design e CQRS
AreaMVC: un'architettura software basata sulla semplicità
Lo sai che si può fare DDD in Javascript grazie a Typescript? Visual Studio e...
Approccio Pratico al Domain Driven Design
Sviluppo MVVM con Android
AntiPatterns: i vizi del programmatore
Tesi Laurea Specialistica Ingegneria Informatica. Alessandro Andreosè
Il web 2.0
SUE AGILE MVVM (Italian)
Inversion of Control @ CD2008
.Net 4.0 Preview @ UGIdotNet
Slide Prelaurea. Alessandro Andreosè
Ad

More from Mauro Servienti (20)

PPTX
Welcome to the (state) machine @ ExploreDDD 2019
PPTX
Designing a ui for microservices @ .NET Day Switzerland 2019
PPTX
Welcome to the (state) machine @ Xe One Day Enterprise Applications
PPTX
All our aggregates are wrong @ NDC Copenhagen 2019
PPTX
Be like water, my friend @ Agile for Innovation 2019
PPTX
Microservices architecture is it the right choice to design long-living syste...
PPTX
Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019
PPTX
Living organizations, particular software @ do IT Better Parma
PPTX
Welcome to the (state) machine @ Crafted Software
PPTX
PO is dead, long live the PO - Italian Agile Day 2018
PPTX
Design a UI for your Microservices @ Do IT Better
PPTX
Microservices and pineapple on pizza what do they have in common - dos and ...
PPTX
All our aggregates are wrong (ExploreDDD 2018)
PPTX
Designing a ui for microservices
PPTX
Po is dead, long live the po
PPTX
Shipping code is not the problem, deciding what to ship it is!
PPTX
GraphQL - Where are you from? Where are you going?
PPTX
Dall'idea al deploy un lungo viaggio che passa per git flow e semver
PPTX
Progettare una UI per i Microservices
PPTX
The road to a Service Oriented Architecture is paved with messages
Welcome to the (state) machine @ ExploreDDD 2019
Designing a ui for microservices @ .NET Day Switzerland 2019
Welcome to the (state) machine @ Xe One Day Enterprise Applications
All our aggregates are wrong @ NDC Copenhagen 2019
Be like water, my friend @ Agile for Innovation 2019
Microservices architecture is it the right choice to design long-living syste...
Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019
Living organizations, particular software @ do IT Better Parma
Welcome to the (state) machine @ Crafted Software
PO is dead, long live the PO - Italian Agile Day 2018
Design a UI for your Microservices @ Do IT Better
Microservices and pineapple on pizza what do they have in common - dos and ...
All our aggregates are wrong (ExploreDDD 2018)
Designing a ui for microservices
Po is dead, long live the po
Shipping code is not the problem, deciding what to ship it is!
GraphQL - Where are you from? Where are you going?
Dall'idea al deploy un lungo viaggio che passa per git flow e semver
Progettare una UI per i Microservices
The road to a Service Oriented Architecture is paved with messages

Silverlight m v-vm @ DotNetteria

  • 1. MODEL VIEW VIEWMODEL Silverlight Version Mauro Servienti Senior Software Architect @ Gaia S.r.l. Microsoft MVP – Visual C# / MCTS mauro.servienti@gaia.is.it http://milestone.topics.it
  • 2. Agenda • Part I • Waiting for Model View ViewModel; • Required & Missing Concepts; • Model View ViewModel Deep Dive; • Part II • Facciamolo!
  • 4. Mumble...mumble... (upfront) • È difficile?  parecchio... :-) • Siamo troppo abituati al «coupling» tra componenti visuali e logica • Quindi...il gioco vale la candela? • Tutta la vita, in particolare al crescere dall’applicazione: • Sia verticalmente: complessità; • Sia orizzontalmente: versioning nel tempo; • C’è rischio di addiction? «Purtroppo» si :-) • Una volta che ci avete preso la mano scrivereste anche il notepad con M-V-VM;
  • 5. Why?... pecccchè? • Perchè adottare un pattern per la presentazione dei dati? • SoC e SPoR sono sicuramente due buonissimi motivi: • Diamo un boost alla manutenibilità liberandoci dello spaghetti code; • Cerchiamo di separare nettamente le figure coinvolte: • Il designer non è il developer e il devloper non è il designer; • Non necessariamente sono figure fisicamente diverse, ma sicuramente sono momenti diversi; • Introduciamo la possibilità di testare il comportamento della logica che gestisce la UI;
  • 6. Talebani o Libertini? • Dogma: Un pattern è un pattern quindi va sempre adattato al contesto in cui viene calato; • Model View ViewModel però...: • Nella sua implementazione con Wpf/Sl è giovane; • Molte cose sono decisamente borderline; • Il contesto d’uso classico, un rich client, lo rende complesso da applicare perchè le celte da fare sono moltissime: • MVC con Asp.net ha decisamente poca libertà di manovra per come è fatto http; • MVP con WinForms è molto limitato dalle limitazioni di WinForms; • All’inizio essere un po’ talebani aiuta a pensare;
  • 9. Overview DependencyObject POCO Instance Tipicamente la UI I nostri dati Dependency CLR Binding Expression Property Property • La BindingSource può essere una qualsiasi istanza, senza nessun requisito; • Il BindingTarget deve essere una Dependency Property, e quindi un l'istanza di un Dependency Object;
  • 10. DataFlow Direction DependencyObject POCO Instance Dependency CLR - OneWay Property Property - TwoWay - OneWayToSource • OneWay: il binding è monodirezionale: • da Source verso Target; • è il default per controlli i read-only (eg. TextBlock); • TwoWay: il binding è bidirezionale: • I dati viaggiano da Source verso Target e viceversa; • È il default per tutti controlli r/w (eg. TextBox) • OneTime: il binding viene valuato una sola valta: • da Source verso Target;
  • 11. Data «Triggers» • Cosa causa il pull/push dei dati? • Source (data)  Target (UI): • OneWay e TwoWay: la source deve implementare un motore di notifica come ad esempio INotifyPropertyChanged; • Nel caso di collection la collection deve supportare la notifica delle variazioni interne... More to come; • Target (UI)  Source (data): • TwoWay e OneWayToSource: • «Default»: predefinito, la source viene aggiornata nel momento in cui il controllo corrente perde il focus; • «PropertyChanged»: la Source è aggiornata ad ogni variazione della proprietà del target; • «Explicit»: la source viene aggiornata solo su richiesta esplicita: BindingExpression.UpdateSource();
  • 12. Xaml everywhere <StackPanel> <StackPanel.Resources> <SomeResourceHere x:Key="myRes"/> </StackPanel.Resources> <StackPanel.DataContext> <Binding Source="{StaticResource myRes}"/> </StackPanel.DataContext> <TextBlock Text="{Binding Path=PropName}" /> </StackPanel>
  • 13. Da WinForms a *.DataContext • In Windows Forms era responsabilità di ogni singolo controllo esporre un sistema per il data binding: • .DataSource; • .SetDataBinding(...); • TextBox.????; • FrameworkElement espone DataContext: • Razionalizza e uniforma l'approccio; • È una Dependency Property: • beneficia del concetto di ereditarietà del valore; • Supporta a sua volta data binding;
  • 14. Binding Pipeline TextBlock MyObject Source  Target Text DateTime Property Target  Source Property • Per impostazione predefinita il motore di binding per la conversione chiama ToString() • NB: In assenza di un template; • Possiamo intervenire nel processo di conversione scrivendo un ValueConverter
  • 15. Binding Pipeline: IValueConverter • IValueConverter definisce solo 2 metodi: • Convert( ... ): viene invocato dal processo di binding nel momento in cui il dato si muove dalla Source verso il Target; • ConvertBack( ... ): viene invocato durante il passaggio opposto, mentre il dato viaggia dal Target verso la Source; <TextBlock Text="{Binding Path=PropName, Converter={StaticResource myConverter}}" />
  • 17. Separation of Concern • Il concetto di command in Silverlight/Wpf è basato sul command pattern: • La logica di esecuzione è independente dalla UI; • Incapsulare la logica di esecuzione permette di avere più entry- point verso quel comando • Chi si ricorda le Action di delphi...?
  • 18. L'interfaccia ICommand • CanExecute( Object ): • L'invoker può sapere se il comando può essere eseguito in un determinato contesto; • Execute( Object ): • L'invoker può invocare il comando; • CanExecuteChanged event: • Il comando può notificare l'invoker di eventuali variazioni del suo stato;
  • 19. LET’S GO Adesso che abbiamo messo le fondamenta...
  • 20. Please welcome M-V-VM presentation View DataBinding Command engine Il centro del ViewModel D.I. mondo! Repository<T> Model data Adapter Somewhere in time...
  • 22. Actors: Model • È uno ed uno solo: • Rappresenta i dati, che in quanti tali, vanno sempre protetti; • Può essere un Object Model o un Domain Model: • È molto più facile che sia un «Object Model» condito da servizi; • È responsabile della validazione statica: • Le regole di validazione non pertinenti al caso d’uso; • È totalmente ignaro del mondo in cui è inserito: • Non implementa INotifyPropertyChanged;
  • 23. Actors: ViewModel • Rappresenta un caso d’uso del Modello: • È un aggregatore di logica e dati; • È responsabile della validazione contestuale: • Casi d’uso diversi con regole di validazione diverse per dati uguali; • È conscio di essere in un mondo basato su DataBinding: • Implementa INotifyPropertyChanged, ma non deriva da Dep.Obj; • E’ responsabile del «flattening» del grafo: • Ricuce l’uso dei comodi ma scomodi converter;
  • 24. Actors: View • È «stupidamente» legata al ViewModel: • Non prende la benchè minima decisione; • Deve essere a prova di designer: • Quindi non deve aver nessun rapporto con il codice; • Deve poter essere disegnata: • Focus on the «Blendability»;
  • 25. Who comes first? • Abbiamo un duopolio... • ma...chi comanda? • ViewModel first? • View first? • Io sono per il ViewModel first perchè vedo la View come una passive-view;
  • 26. SEE IT LIVE! Hands on Model View ViewModel
  • 27. Recap • Abbiamo definito il modello: Person/Address; • OT: Abbiamo introdotto il concetto di DataContext; • Abbiamo costruito dei casi d’uso sul modello: ViewModel • Visualizzare un elenco di persone; • Visualizzare il dettaglio della persona selezionata; • Abbiamo «visualizzato» i casi d’uso: View; • Potevamo scrivere dei test prima di arrivare alla View? • Servono ancora gli «U.A.T.»?
  • 28. Q&A do not shoot the pianist