Bonjour à tous,

Je me mets petit à petit à Silverlight et MVVM et j'ai besoin de vos lumières.

Je développe une petite application WP7 et rencontre une difficulté à utiliser MVVM Light et le pattern Service Locator. Cette difficulté est plus inhérente à MVVM qu'à WP7.

J'ai une ApplicationBar dans une Page :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
<phone:PhoneApplicationPage 
    ...
    DataContext="{Binding PivotPage, Source={StaticResource Locator}}">

<Grid>...</Grid>

<phone:PhoneApplicationPage.ApplicationBar>
   <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
     <shell:ApplicationBarIconButton x:Name="appbar1" IconUri="..." Text="1" 
     Click="ApplicationBarMenuItemClick" />
   </shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>
Le contrôle ApplicationBarIconButton n'a pas de propriété Command. Je ne peux donc Binder la commande de mon ViewModel. Il faut donc utiliser l'évènement Click (cf le billet de Laurent Bugnion à ce sujet), comme ceci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
private void ApplicationBarMenuItemClick(object sender, System.EventArgs e)
{
    var vm = DataContext as PivotViewModel;
    if (vm != null)
    {
        vm.MyCommand.Execute(null);
    }
}
Jusque là pas de problème. Là où ça se complique c'est dans l'utilisation du pattern Service Locator : ma View ne connait pas et ne doit pas connaître le ViewModel attaché. La solution de facilité reviendrait à coupler la View au ViewModel, mais ça n'est pas propre.

Avez-vous une astuce ? Peut-être en utilisant le Messenger de MVVM Light Toolkit ?

Merci d'avance.