Me he encontrado con un problema con WPF y los comandos que están vinculados a un botón dentro del DataTemplate de un ItemsControl. El escenario es bastante sencillo. ItemsControl está vinculado a una lista de objetos, y quiero poder eliminar cada objeto de la lista haciendo clic en un botón. El botón ejecuta un comando y el comando se encarga de la eliminación. El parámetro CommandParameter está vinculado al objeto que quiero eliminar. De esa manera sé en qué hizo clic el usuario. Un usuario solo debería poder eliminar sus "propios" objetos, por lo que necesito hacer algunas comprobaciones en la llamada "CanExecute" del comando para verificar que el usuario tiene los permisos correctos.
El problema es que el parámetro pasado a CanExecute es NULL la primera vez que se llama, por lo que no puedo ejecutar la lógica para habilitar / deshabilitar el comando. Sin embargo, si lo habilito siempre y luego hago clic en el botón para ejecutar el comando, el parámetro CommandParameter se pasa correctamente. Eso significa que el enlace contra CommandParameter está funcionando.
El XAML para ItemsControl y DataTemplate se ve así:
<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 puede ver, tengo una lista de objetos Comentarios. Quiero que el parámetro CommandParameter del DeleteCommentCommand esté vinculado al objeto Command.
Así que supongo que mi pregunta es: ¿alguien ha experimentado este problema antes? CanExecute recibe una llamada en mi comando, pero el parámetro siempre es NULL la primera vez, ¿por qué?
Actualización: pude reducir un poco el problema. Agregué un Debug ValueConverter vacío para poder generar un mensaje cuando CommandParameter está vinculado a datos. Resulta que el problema es que el método CanExecute se ejecuta antes de que CommandParameter esté vinculado al botón. Intenté configurar el parámetro CommandParameter antes del comando (como se sugiere), pero todavía no funciona. Cualquier consejo sobre cómo controlarlo.
Update2: ¿Hay alguna forma de detectar cuando el enlace está "hecho", de modo que pueda forzar la reevaluación del comando? Además, ¿es un problema que tenga varios botones (uno para cada elemento en ItemsControl) que se unen a la misma instancia de un objeto Command?
Update3: He subido una reproducción del error a mi SkyDrive: http://cid-1a08c11c407c0d8e.skydrive.live.com/self.aspx/Code%20samples/CommandParameterBinding.zip