ApplicationBarIcon sense Command a Windows Phone

Existeix el model MVVM (Model-Vista-Vista Model) que és realment pràctic quan desenvolupem aplicacions amb WPF o Silverlight i ara també amb Windows Phone. Aquest patró entre altres coses et permet separar les dades de la interfície de manera que el codi associat a una Window, Page, usercontrol o PhoneApplicationPage sol estar pràcticament en blanc ja que gràcies al model d’enllaç de dades els controls de la pantalla s’enllacen a una instància de classe que té les dades. Mireu l’exemple del model MVVM que et dóna Microsoft.

Pel que fa a les accions generades per l’usuari enlloc de tractar els events dels diferents controls s’utilitza el patró Command que a part de ser senzill és molt útil per gestionar quant un control està disponible per ser premut o no.

Amb aplicacions per Windows Phone 7 i 7.5 existeix un control anomenat ApplicationBar que és el que apareix a la part inferior de tota app.

Aquest control conté botons o icones que l’usuari pot interactuar. Aquests icones s’anomenen ApplicationBarIconButton.

ApplicationBarIconButton no té l’atribut Command i per tant estem obligats a per força tractar l’event click d’aquests botons. Personalment penso que és una pena però és així. Dic que és una pena perquè el model Command té la possibilitat de poder dir al botó si està en propietat Enabled o no, de manera que és la pròpia app qui sap quan es pot prémer un botó o no.

En aquest cas, hem de fer-ho nosaltres personalment. La meva recomanació és utilitzar igualment el model MVVM i des del codi associat a la PhoneApplicationPage modificar el valor de la propietat IsEnabled adequadament.

Seria una cosa semblant a :

PublishAppButton.IsEnabled = (DataContext as ViewModel.MainPageViewModel).PublishCommand.CanExecute(null);

Però els problemes no s’han acabat. Resulta que ApplicationBar no és FrameworkElements i no es pot trobar el control botó dins la llista d’elements del control ApplicationBar.

Per sort, sempre tenim un workaround.

PublishAppButton = ApplicationBar.Buttons[0] as Microsoft.Phone.Shell.ApplicationBarIconButton;
PublishAppButton.IsEnabled = (DataContext as ViewModel.MainPageViewModel).PublishCommand.CanExecute(null);

Tenim que accedir per posició d’array a la propietat Buttons del control ApplicationBar.

Aquest seria el seu XAML associat:

<phone:PhoneApplicationPage.ApplicationBar>
        <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
            <shell:ApplicationBarIconButton IconUri="/Icons/appbar.save.rest.png" Text="Publish" Click="ApplicationBarIconButton_Click_2" />
        </shell:ApplicationBar>
    </phone:PhoneApplicationPage.ApplicationBar>

Per la execució de la comanda associada és tal i com indica el següent tros de codi:

private void ApplicationBarIconButton_Click_2(object sender, EventArgs e)
{             
  if ((DataContext as ViewModel.MainPageViewModel).PublishCommand.CanExecute(null))                 
     (DataContext as ViewModel.MainPageViewModel).PublishCommand.Execute(null);
}
Anuncis

Deixa un comentari

Fill in your details below or click an icon to log in:

WordPress.com Logo

Esteu comentant fent servir el compte WordPress.com. Log Out / Canvia )

Twitter picture

Esteu comentant fent servir el compte Twitter. Log Out / Canvia )

Facebook photo

Esteu comentant fent servir el compte Facebook. Log Out / Canvia )

Google+ photo

Esteu comentant fent servir el compte Google+. Log Out / Canvia )

Connecting to %s