Eu tive um problema com o WPF e os comandos vinculados a um botão dentro do DataTemplate de um ItemsControl. O cenário é bastante simples. O ItemsControl está vinculado a uma lista de objetos e quero poder remover cada objeto da lista clicando em um botão. O Botão executa um Comando e o Comando cuida da exclusão. O CommandParameter está vinculado ao objeto que desejo excluir. Assim eu sei o que o usuário clicou. Um usuário só deve ser capaz de excluir seus "próprios" objetos - portanto, preciso fazer algumas verificações na chamada "CanExecute" do Comando para verificar se o usuário tem as permissões corretas.
O problema é que o parâmetro passado para CanExecute é NULL na primeira vez que é chamado - então não consigo executar a lógica para habilitar / desabilitar o comando. No entanto, se eu ativá-lo sempre e clicar no botão para executar o comando, o CommandParameter é passado corretamente. Isso significa que a vinculação ao CommandParameter está funcionando.
O XAML para ItemsControl e DataTemplate se parece com isto:
<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>
Como você pode ver, tenho uma lista de objetos Comentários. Eu quero que o CommandParameter do DeleteCommentCommand seja vinculado ao objeto Command.
Portanto, acho que minha pergunta é: alguém já experimentou esse problema antes? CanExecute é chamado no meu comando, mas o parâmetro é sempre NULL na primeira vez - por que isso?
Atualização: consegui reduzir um pouco o problema. Eu adicionei um Debug ValueConverter vazio para que eu pudesse enviar uma mensagem quando o CommandParameter estiver vinculado aos dados. Acontece que o problema é que o método CanExecute é executado antes que CommandParameter seja vinculado ao botão. Eu tentei definir o CommandParameter antes do comando (como sugerido) - mas ainda não funciona. Alguma dica sobre como controlá-lo.
Update2: Existe alguma maneira de detectar quando a ligação está "concluída", para que eu possa forçar a reavaliação do comando? Além disso - é um problema que eu tenho vários botões (um para cada item no ItemsControl) que se ligam à mesma instância de um objeto de comando?
Update3: Eu carreguei uma reprodução do bug no meu SkyDrive: http://cid-1a08c11c407c0d8e.skydrive.live.com/self.aspx/Code%20samples/CommandParameterBinding.zip