15
CanExecuteが最初に呼び出されたときにWPFCommandParameterがNULLになる
ItemsControlのDataTemplate内のボタンにバインドされているWPFとコマンドで問題が発生しました。シナリオは非常に単純です。ItemsControlはオブジェクトのリストにバインドされており、ボタンをクリックしてリスト内の各オブジェクトを削除できるようにしたいと思います。ボタンはコマンドを実行し、コマンドが削除を処理します。CommandParameterは、削除するオブジェクトにバインドされています。そうすれば、ユーザーが何をクリックしたかがわかります。ユーザーは自分の「自分の」オブジェクトのみを削除できるはずです。そのため、コマンドの「CanExecute」呼び出しでいくつかのチェックを行って、ユーザーが適切な権限を持っていることを確認する必要があります。 問題は、CanExecuteに渡されるパラメーターが最初に呼び出されたときにNULLであるため、コマンドを有効/無効にするロジックを実行できないことです。ただし、常に有効にしてからボタンをクリックしてコマンドを実行すると、CommandParameterが正しく渡されます。つまり、CommandParameterに対するバインディングが機能しているということです。 ItemsControlとDataTemplateのXAMLは次のようになります。 <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> ご覧のとおり、Commentsオブジェクトのリストがあります。DeleteCommentCommandのCommandParameterをCommandオブジェクトにバインドしたいと思います。 だから私の質問は、誰かが以前にこの問題を経験したことがあるかということだと思います。CanExecuteがコマンドで呼び出されますが、パラメーターは最初は常にNULLです-それはなぜですか? 更新:問題を少し絞り込むことができました。CommandParameterがデータバインドされているときにメッセージを出力できるように、空のDebugValueConverterを追加しました。問題は、CommandParameterがボタンにバインドされる前にCanExecuteメソッドが実行されることです。コマンドの前にCommandParameterを設定しようとしましたが(提案されているように)、それでも機能しません。それを制御する方法に関するヒント。 Update2:バインディングが「完了」したことを検出して、コマンドの再評価を強制できるようにする方法はありますか?また、コマンドオブジェクトの同じインスタンスにバインドする複数のボタン(ItemsControlの各アイテムに1つ)があるのは問題ですか? Update3と:私は私のSkyDriveにバグの再現をアップロードしていますhttp://cid-1a08c11c407c0d8e.skydrive.live.com/self.aspx/Code%20samples/CommandParameterBinding.zip