Ich bin auf ein Problem mit WPF und Befehlen gestoßen, die an eine Schaltfläche in der DataTemplate eines ItemsControl gebunden sind. Das Szenario ist recht einfach. Das ItemsControl ist an eine Liste von Objekten gebunden, und ich möchte in der Lage sein, jedes Objekt in der Liste durch Klicken auf eine Schaltfläche zu entfernen. Die Schaltfläche führt einen Befehl aus, und der Befehl kümmert sich um das Löschen. Der CommandParameter ist an das Objekt gebunden, das ich löschen möchte. Auf diese Weise weiß ich, worauf der Benutzer geklickt hat. Ein Benutzer sollte nur in der Lage sein, seine "eigenen" Objekte zu löschen. Daher muss ich beim Aufruf "CanExecute" des Befehls einige Überprüfungen durchführen, um zu überprüfen, ob der Benutzer über die richtigen Berechtigungen verfügt.
Das Problem ist, dass der an CanExecute übergebene Parameter beim ersten Aufruf NULL ist. Daher kann ich die Logik zum Aktivieren / Deaktivieren des Befehls nicht ausführen. Wenn ich es jedoch immer aktiviert mache und dann auf die Schaltfläche klicke, um den Befehl auszuführen, wird der CommandParameter korrekt übergeben. Das bedeutet also, dass die Bindung gegen den CommandParameter funktioniert.
Die XAML für das ItemsControl und das DataTemplate sieht folgendermaßen aus:
<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>
Wie Sie sehen können, habe ich eine Liste von Kommentarobjekten. Ich möchte, dass der CommandParameter des DeleteCommentCommand an das Command-Objekt gebunden wird.
Meine Frage ist also: Hat jemand dieses Problem schon einmal erlebt? CanExecute wird in meinem Befehl aufgerufen, aber der Parameter ist beim ersten Mal immer NULL - warum ist das so?
Update: Ich konnte das Problem ein wenig eingrenzen. Ich habe einen leeren Debug ValueConverter hinzugefügt, damit ich eine Nachricht ausgeben kann, wenn der CommandParameter datengebunden ist. Es stellt sich heraus, dass das Problem darin besteht, dass die CanExecute-Methode ausgeführt wird, bevor der CommandParameter an die Schaltfläche gebunden wird. Ich habe versucht, den CommandParameter vor dem Command festzulegen (wie vorgeschlagen) - aber es funktioniert immer noch nicht. Irgendwelche Tipps zur Steuerung.
Update2: Gibt es eine Möglichkeit zu erkennen, wann die Bindung "abgeschlossen" ist, damit ich eine Neubewertung des Befehls erzwingen kann? Auch - ist es ein Problem, dass ich mehrere Schaltflächen habe (eine für jedes Element im ItemsControl), die an dieselbe Instanz eines Befehlsobjekts gebunden sind?
Update3: Ich habe eine Reproduktion des Fehlers auf mein SkyDrive hochgeladen: http://cid-1a08c11c407c0d8e.skydrive.live.com/self.aspx/Code%20samples/CommandParameterBinding.zip