J'ai rencontré un problème avec WPF et les commandes liées à un bouton dans le DataTemplate d'un ItemsControl. Le scénario est assez simple. Le ItemsControl est lié à une liste d'objets, et je souhaite pouvoir supprimer chaque objet de la liste en cliquant sur un bouton. Le bouton exécute une commande et la commande se charge de la suppression. Le CommandParameter est lié à l'objet que je souhaite supprimer. De cette façon, je sais sur quoi l'utilisateur a cliqué. Un utilisateur ne doit pouvoir supprimer que ses "propres" objets - je dois donc faire quelques vérifications dans l'appel "CanExecute" de la commande pour vérifier que l'utilisateur dispose des bonnes autorisations.
Le problème est que le paramètre passé à CanExecute est NULL la première fois qu'il est appelé - je ne peux donc pas exécuter la logique pour activer / désactiver la commande. Cependant, si je le fais toujours activé, puis que je clique sur le bouton pour exécuter la commande, le CommandParameter est transmis correctement. Cela signifie donc que la liaison avec CommandParameter fonctionne.
Le XAML pour le ItemsControl et le DataTemplate ressemble à ceci:
<ItemsControl
x:Name="commentsList"
ItemsSource="{Binding Path=SharedDataItemPM.Comments}"
Width="Auto" Height="Auto">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Button
Content="Delete"
FontSize="10"
Command="{Binding Path=DataContext.DeleteCommentCommand, ElementName=commentsList}"
CommandParameter="{Binding}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Donc, comme vous pouvez le voir, j'ai une liste d'objets Comments. Je veux que le CommandParameter de DeleteCommentCommand soit lié à l'objet Command.
Donc, je suppose que ma question est: est-ce que quelqu'un a déjà rencontré ce problème? CanExecute est appelé sur ma commande, mais le paramètre est toujours NULL la première fois - pourquoi?
Mise à jour: j'ai pu affiner un peu le problème. J'ai ajouté un Debug ValueConverter vide afin que je puisse sortir un message lorsque CommandParameter est lié aux données. Il s'avère que le problème est que la méthode CanExecute est exécutée avant que CommandParameter ne soit lié au bouton. J'ai essayé de définir le CommandParameter avant la commande (comme suggéré) - mais cela ne fonctionne toujours pas. Des conseils sur la façon de le contrôler.
Mise à jour2: Existe t-il un moyen de détecter quand la liaison est "terminée", afin que je puisse forcer la réévaluation de la commande? Est-ce aussi un problème que j'ai plusieurs boutons (un pour chaque élément dans le ItemsControl) qui se lient à la même instance d'un objet de commande?
Update3: J'ai téléchargé une reproduction du bogue sur mon SkyDrive: http://cid-1a08c11c407c0d8e.skydrive.live.com/self.aspx/Code%20samples/CommandParameterBinding.zip