27juil. 2012

WPF : Le paramètre d'une commande null dans CanExecute au premier appel

J'ai été confronté à un "bug" WPF. Je construis actuellement des commandes injectables par MEF. L'objectif est de factoriser ces commandes entre plusieurs ViewModel et de les déployer rapidement.

Le coeur du système est le passage par binding du paramètre à la commande. Ceci est obligatoire pour la méthode CanExecute comme pour la méthode Execute. Et là, c'est le drame.

La faute à l'analyseur XAML qui génère le code behind C#. L'assignation des binding se fait dans l'ordre d'apparition des attributs des balises. Ainsi si la déclaration est:

<Button Content="OK" 
    Command="{Binding Path=SubmitCommand, 
        Mode=OneTime}"
    CommandParameter="{Binding Path=MyParameter, 
        Mode=OneTime}"/>

Le binding de la commande est fait en premier, puis celui du paramètre. Le contrôle fait son appel sur CanExecute de l'interface dès que le binding est fait.

Ainsi, CanExecute est appelée avant que le CommandParameter soit lié. La valeur est donc à null. Il faut donc inverser la déclaration du binding de la commande et du paramètre:

<Button Content="OK" 
    CommandParameter="{Binding Path=MyParameter, 
        Mode=OneTime}"
    Command="{Binding Path=SubmitCommand, 
        Mode=OneTime}"/>

aucun commentaire

Fil des commentaires de ce billet

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.