Ho riscontrato un problema con WPF e comandi associati a un pulsante all'interno del DataTemplate di un ItemsControl. Lo scenario è abbastanza semplice. ItemsControl è associato a un elenco di oggetti e desidero essere in grado di rimuovere ogni oggetto nell'elenco facendo clic su un pulsante. Il pulsante esegue un comando e il comando si occupa della cancellazione. CommandParameter è associato all'oggetto che desidero eliminare. In questo modo so cosa ha cliccato l'utente. Un utente dovrebbe essere in grado di eliminare solo i propri "oggetti", quindi è necessario eseguire alcuni controlli nella chiamata "CanExecute" del comando per verificare che l'utente disponga delle autorizzazioni corrette.
Il problema è che il parametro passato a CanExecute è NULL la prima volta che viene chiamato, quindi non posso eseguire la logica per abilitare / disabilitare il comando. Tuttavia, se lo rendo sempre abilitato e quindi faccio clic sul pulsante per eseguire il comando, CommandParameter viene passato correttamente. Quindi ciò significa che l'associazione con CommandParameter funziona.
Il codice XAML per ItemsControl e DataTemplate ha il seguente aspetto:
<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>
Quindi, come puoi vedere, ho un elenco di oggetti Commenti. Voglio che il CommandParameter di DeleteCommentCommand sia associato all'oggetto Command.
Quindi immagino che la mia domanda sia: qualcuno ha mai sperimentato questo problema prima? CanExecute viene chiamato sul mio comando, ma la prima volta il parametro è sempre NULL - perché?
Aggiornamento: sono riuscito a restringere un po 'il problema. Ho aggiunto un ValueConverter di debug vuoto in modo da poter generare un messaggio quando CommandParameter è associato ai dati. Si scopre che il problema è che il metodo CanExecute viene eseguito prima che CommandParameter sia associato al pulsante. Ho provato a impostare CommandParameter prima del comando (come suggerito), ma ancora non funziona. Eventuali suggerimenti su come controllarlo.
Update2: esiste un modo per rilevare quando l'associazione è "terminata", in modo da poter forzare la rivalutazione del comando? Inoltre, è un problema avere più pulsanti (uno per ogni elemento in ItemsControl) che si legano alla stessa istanza di un oggetto Command?
Update3: ho caricato una riproduzione del bug sul mio SkyDrive: http://cid-1a08c11c407c0d8e.skydrive.live.com/self.aspx/Code%20samples/CommandParameterBinding.zip