SimpleMVVMBinding

Idea: At afprøve simpel binding og MVVM-arkitekturen.
Background: MVVM og Binding

 

I Denne opgave skal der arbejdes med simpel binding og MVVM-arkitektur til windows 10 App.
Der skal testes binding og MVVM (Model-View-ViewModel), der skal benyttes ObservableCollection og INotifyPropertyChange til at realisere bindingen i en simpel MVVM-arkitektur. I denne opgave benyttes simpel CallMethodAction (i senere opgaver arbejdes med ICommand og RelayCommand i stedet)

Simpel binding mellem 2 GUI-Controls (TextBox)

a) Opret et nyt Windows Universal projekt (Blank App (Universal Windows)): SimpleBindingVV -

b) Opret to TextBox Controls og navngiv dem TB1 og TB2

c) Lav en binding således at TB2 er bundet til TB1 og kør programmet - og test hvad der sker når du skriver i TB1

Hint: I XAML, sæt TB2's text-property til Text="{Binding Text, ElementName=TB1, Mode=OneWay}"

d) Test forskellen mellem "OneTime", "OneWay" og "TwoWay"

Undersøg om der sker en opdatering (og hvis, hvornår den sker) i TB2 når der skrives i TB1 og omvendt.
Prøv også at indsætte UpdateSourceTrigger=PropertyChanged og undersøg om det giver en forskel.

Hint: Test også UpdateSour Text="{Binding Text, ElementName=TB1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"


Simpel binding mellem GUI-Control og Model (mellem en TextBox i MainPage og en Property i en Model-klasse)

e) Under samme solution - opret et nyt Windows App projekt (Blank App (windows)): SimpleBindingVM

f) Opret en ny klasse: Model.

g) Implementer INotifyPropertyChanged:

 

h) Opret en property: string Name (prop ->)

i) Opret en default konstruktør (ctor ->) og initialiser Name til en default værdi - fx "Default"

j) Lav propertien Name om til en "property with backing field" og lav set-metoden om til "To statement body" tilføj et kald af OnPropertyChanged( ) sidst i set-metoden

k) I MainPage oprettes en TextBox Controls TB1(som under forige opgave)

l) Sæt DataContext på page til Model

Hint: I XAML tilføjes:


<Page.DataContext>

<local:Model/>

</Page.DataContext>

Bemærk: Hvis du får en Error, så tjek om du har husket en default konstruktør (parameterløs). Prøv evt. at Rebuilde projektet - og husk at sætte projektet: SimpleBindingVM til startup project.

m) Bind Text-propertien på TextBoxen til Name-propertien i Model - Test (Run): bliver default værdien vist i TextBox'en?

Hint:
Text="{Binding Name}"
Har du husket at sætte det nye projekt som StartUp project? - ellers er det ikke det nye projekt "SimpleBindingVM" der køres, men det tidligere projekt: "SimpleindingVV".


n) I MainPage oprettes endnu en TextBox Controls TB2 der ligeledes skal have en text-binding til Models Name property.

Kør programmet - sker der noget når du skriver i de 2 tekst-bokse?

o) Nej, der sker ikke noget, men prøv nu at tilføje Mode=TwoWay og UpdateSourceTrigger=PropertyChanged til TB1 og test igen.

p) Test: hvad er forskellen på om UpdateSourceTrigger er sat for både TB1 og TB2, kun for TB2 og hverken TB1 eller TB2?

 

Simpel binding mellem GUI-contol (View) og en ObservableCollection (ViewModel) af Models (Model) - MVVM

q) Under samme solution - opret et nyt Windows App projekt (Blank App (windows)): SimpleBindingMVVM

r) Opret en ny klasse: Model med en property Name og konstruktører (ctorp og ctor)

r) Opret en ny klasse: ViewModel med

s) I MainPage sættes DataContext til ViewModel (husk evt at Builde projektet først)

Hint:

<Page.DataContext>
<local:ViewModel></local:ViewModel>
</Page.DataContext>


t) Indsæt en GUI-Control: ListView og lav en binding af dennes ItemSource-property til "Models"

Hint: <ListView ItemsSource="{Binding Models}" ....>

 

u) Test - ser det pænt ud?

 

Udvidelse (TextBox og Button til oprettelse af nye navne)
v) Klassen ViewModel udvides med

w) Tilføj en TextBox og bind Text til Name i ViewModel (husk UpdateSourceTrigger = PropertyChanged under More Settings)

x) Tilføj en Button til MainPage og opdater XAML-koden med:

<Button Content="Add Name" HorizontalAlignment="Left" Margin="857,361,0,0" VerticalAlignment="Top">
<Interactivity:Interaction.Behaviors>
<Core:EventTriggerBehavior EventName="Click">
<Core:CallMethodAction TargetObject="{Binding Mode=OneWay}" MethodName="Add"/>
</Core:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors>
</Button>

Hint: Åben Blend (højre-klik på MainPage -> Design in blend) første gang tager det lidt tid at klargøre. I Blend klik på Assets og derefter Behaviors - Installer tilhørende NuGet-pakke.
Herefter kan der "trækkes" en CallMethodAction behaviors ned på vores Button (i Objects and Timelines).

Kan gøres i Blend se: https://channel9.msdn.com/Series/design-xaml-ui-with-blend/03 (specielt fra 32:30 ->)

Koden binder Add( ) metoden i ViewModel til click-event på vores Button, så den kaldes når der trykkes på knappen

y) Test :)

z) Gør GUI lidt pænere at se på !!

 

God fornøjelse /Henrik