Mivel az Mvvm felépítése megköveteli, hogy a View csak a ViewModell-re tartalmazzon referenciát ezért ha View-ból bármit műveletet kell a ViewModel-en végezni, akkor annak a referenciáját fel kell használni.
ViewModel _viewModel;
_viewModel.DoSomething();
Amennyiben egy a Model-ben levő metódust kell elérni, azt csak a ViewModel-en keresztül lehet megtenni. Mindez az alábbi folyamatot eredményezi
1. Az XAML-ban deklarált Button Click eseményét feldolgozza a View-ban egy eljárás.
2. A metódusból meghívásra kerül a ViewModel DoSomething() metódusa
3. Amely meghívja a Model DoSomething() metódusát
A WPF Command az első lépés teljes mértékű kihagyásával segít egyszerűsíteni ezt a folyamatot.
Az WPF #4 bejegyzésben bemutatott kódot az alábbi osztállyal kell kiegészíteni.
A Command megköveteli, hogy az ICommand Interface-ból származtassuk.
Az Interface az alábbiakat követeli meg
- EventHandler CanExecuteChanged
- bool CanExecute
- void Execute
Az osztályban további tetszőleges metódusok, tagváltozók és tulajdonságok deklarálhatók.
Mivel a Button megnyomásakor valamilyen - a ViewModelben elhelyezett - eljárás lefutása megkívánt ezért egy CallBack Action magáért beszél, amelynek az értéke a Konstruktor meghívásakor kerül beállításra.
private readonly Action _executeMethod;
A CanExecute eljárás dönti el, hogy az adott Command lefuttatható-e. Amennyiben false értékkel tér vissza, a View-ban lévő Button inaktív állapotba kerül. (Ez könnyen kipróbálható, a true értéket false-ra kell cserélni)
Az Execute lefuttatja a Command-nak átadott CallBack metódust
A ViewModel az alábbiak szerint változik:
A ViewModel-ben deklarálásra kerül egy ICommand típusú tulajdonság, amelynek a konstruktorban - a létrhozásakor - átadásra kerül a CallBack függvény.
A gomb lenyomásakor Command osztály Execute metódusa ezt a függvényt hívja meg. Mivel ez a ViewModel-ben található, ezért annak minden elemét eléri.
A View-hoz egy Button kerül hozzáadásra.
<Grid>
<Grid.Resources>
<DataTemplate x:Key="MyListTemplate" >
<TextBlock Text="{Binding TextValue}" Height="15"/>
</DataTemplate>
</Grid.Resources>
<ListBox Height="150"
ItemsSource="{Binding MyModelCollection}"
ItemTemplate="{StaticResource MyListTemplate}">
</ListBox>
<button VerticalAlignment="Top" Width="100" Height="20" Content="Add new item" Command="{Binding Incrementcommand}"/>
</Grid>
<Grid.Resources>
<DataTemplate x:Key="MyListTemplate" >
<TextBlock Text="{Binding TextValue}" Height="15"/>
</DataTemplate>
</Grid.Resources>
<ListBox Height="150"
ItemsSource="{Binding MyModelCollection}"
ItemTemplate="{StaticResource MyListTemplate}">
</ListBox>
<button VerticalAlignment="Top" Width="100" Height="20" Content="Add new item" Command="{Binding Incrementcommand}"/>
</Grid>
A Button Command attributumához adatkötéssel csatolásra kerül a ViewModel-ben található publikus Incrementcommand tulajdonság.
A View kódja nem változik
Nincsenek megjegyzések:
Megjegyzés küldése