Ich habe ein Problem mit WPF und Befehle, die an eine Schaltfläche innerhalb der DataTemplate eines ItemsControl gebunden sind, aufgetreten. Das Szenario ist ziemlich geradlinig. 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. Der Button führt einen Befehl aus und der Befehl kümmert sich um den Löschvorgang. 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 im "CanExecute" -Aufruf des Befehls prüfen, ob der Benutzer die richtigen Berechtigungen hat.WPF CommandParameter ist NULL zum ersten Mal CanExecute heißt
Das Problem ist, dass der an CanExecute übergebene Parameter beim ersten Aufruf NULL ist - also kann ich die Logik nicht ausführen, um den Befehl zu aktivieren/deaktivieren. Wenn ich es jedoch immer aktiviert habe und dann auf die Schaltfläche zum Ausführen des Befehls klicke, wird CommandParameter korrekt übergeben. Das bedeutet also, dass die Bindung an das CommandParameter funktioniert.
Die XAML für das Itemscontrol und der Datatemplate sieht wie folgt 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>
So wie du, ich habe eine Liste von Objekten Kommentare sehen können. Ich möchte, dass der CommandParameter des DeleteCommentCommand an das Command-Objekt gebunden wird.
Also ich denke, meine Frage ist: habe jemand dieses Problem schon einmal erlebt? CanExecute wird auf meinem Befehl aufgerufen, aber der Parameter ist beim ersten Mal immer NULL - warum ist das?
Update: Ich konnte das Problem etwas eingrenzen. Ich habe einen leeren Debug ValueConverter hinzugefügt, so dass ich eine Nachricht ausgeben konnte, wenn der CommandParameter Daten gebunden ist. Das Problem besteht darin, dass die CanExecute-Methode ausgeführt wird, bevor der CommandParameter an die Schaltfläche gebunden ist. Ich habe versucht, das CommandParameter vor dem Befehl zu setzen (wie vorgeschlagen) - aber es funktioniert immer noch nicht. Irgendwelche Tipps, wie man es kontrolliert.
Update2: Gibt es eine Möglichkeit zu erkennen, wenn die Bindung "erledigt" ist, so dass ich eine erneute Auswertung des Befehls erzwingen kann? Außerdem - ist es ein Problem, dass ich mehrere Schaltflächen (eine für jedes Element im ItemsControl) habe, die an dieselbe Instanz eines Befehlsobjekts binden?
Update3: Ich habe eine Reproduktion des Fehlers zu meinem SkyDrive hochgeladen: http://cid-1a08c11c407c0d8e.skydrive.live.com/self.aspx/Code%20samples/CommandParameterBinding.zip
Ich habe genau dasselbe Problem, mit einer ListBox. –