J'ai rencontré un problème avec WPF et les commandes qui sont 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 veux 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 veux supprimer. Ainsi, je sais sur quoi l'utilisateur a cliqué. Un utilisateur ne doit pouvoir supprimer que ses "propres" objets. Je dois donc effectuer quelques vérifications dans l'appel "CanExecute" de la commande pour m'assurer 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 fais en sorte qu'elle soit toujours activée, puis que je clique sur le bouton pour exécuter la commande, le CommandParameter est transmis correctement. Cela signifie donc que la liaison avec le 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>
Comme vous pouvez le voir, j'ai donc une liste d'objets Commentaires. Je veux que le CommandParameter de la commande DeleteCommentCommand soit lié à l'objet Command.
Je suppose donc que ma question est la suivante : quelqu'un a-t-il 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 réduire un peu le problème. J'ai ajouté un ValueConverter Debug vide afin de pouvoir afficher un message lorsque le 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 le CommandParameter soit lié au bouton. J'ai essayé de placer le CommandParameter avant la commande (comme suggéré), mais cela ne fonctionne toujours pas. Avez-vous des conseils sur la façon de contrôler ce problème ?
Mise à jour2 : Existe-t-il un moyen de détecter quand la liaison est "terminée", afin de pouvoir forcer la réévaluation de la commande ? Par ailleurs, le fait que plusieurs boutons (un pour chaque élément du ItemsControl) soient liés à la même instance d'un objet de commande pose-t-il un problème ?
Mise à jour3 : J'ai téléchargé une reproduction du bug sur mon SkyDrive : http://cid-1a08c11c407c0d8e.skydrive.live.com/self.aspx/Code%20samples/CommandParameterBinding.zip
0 votes
J'ai exactement le même problème, avec une ListBox.
1 votes
Il existe actuellement un rapport de bogue ouvert contre WPF pour ce problème : github.com/dotnet/wpf/issues/316