none
XAML : Ordre des paramètres RRS feed

  • Question

  • Bonjour,

    Je voudrais vous faire part d'une suggestion concernant les paramètres Command et CommandParameter en XAML. Jusqu'à présent, il me semblait que l'ordre des propriétés en XAML était sans importance. Je l'ai appris à mes dépends au bout de plusieurs heures de debug que ce n'est pas le cas (à moins que j'ai manqué un paragraphe dans votre documentation...).

    Si ce n'est pas fait, je vous suggère donc de bien le préciser dans l'aide des classes Command et CommandParameter.

    Si CommandParameter est spécifié avant Command, la command est bien appelée avec le bon paramètre dans le InitializeComponent. Sinon, le paramètre est null à l'initialisation.

    J'ai reproduit le problème dans un petit exemple :
    Window1.xaml :
    <Window x:Class="Bug_CommandParameter.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Bug_CommandParameter"
        Title="Window1" Height="300" Width="300">
        <Window.CommandBindings>
            <CommandBinding Command="local:Window1.TestCommand"
                            CanExecute="CanTestCommand"/>
        </Window.CommandBindings>
        <StackPanel>
            <TextBlock TextWrapping="Wrap" Margin="10" Background="Beige">Sample to show that order matters with Command and CommandParameter</TextBlock>
            <TextBlock TextWrapping="Wrap" Margin="10">In the InitialiseComponent</TextBlock>
            <Button Name="BtBefore" Margin="5"
                    CommandParameter="Bt1"
                    Command="local:Window1.TestCommand">
                Button with CommandParameter before Command
            </Button>
            <Button Name="BtAfter" Margin="5"
                    Command="local:Window1.TestCommand"
                    CommandParameter="Bt2">
                Button with CommandParameter after Command
            </Button>
        </StackPanel>
    </Window>
    
    Window1.xaml.cs :
    namespace Bug_CommandParameter
    {
        /// <summary>
        /// Logique d'interaction pour Window1.xaml
        /// </summary>
        public partial class Window1 : Window
        {
            public Window1()
            {
                InitializeComponent();
            }
    
            public static RoutedCommand TestCommand = new RoutedCommand();
            private void CanTestCommand(object sender, CanExecuteRoutedEventArgs args)
            {
                if (args.Parameter == null)
                {
                    MessageBox.Show((args.Source as Button).Name + "'s parameter is null");
                }
    
                args.CanExecute = args.Parameter != null;
            }
        }
    }
    • Déplacé Tagore Bandlamudi mercredi 7 juillet 2010 06:00 Forums Consolidation (Origine :Visual Studio - Commentaires et suggestions)
    jeudi 16 juillet 2009 09:51

Toutes les réponses

  • Ben ca marche tres bien ?!!! Il faut bien qu'il affecte toutes les propriétés les unes apres les autres.

    Le pb est qu'en réalité, il passe 2 fois dans le CanExecuteCommand, voire même plus si affinité. Mais in fine, tes 2 boutons sont bien opérationnels avec les bons CommandParameter.
    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone
    mercredi 7 octobre 2009 16:17