2013. április 1., hétfő

Wpf #4 Command

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>

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