私は現在、MVVM Light Toolkit を Josh Smith の RelayCommand と組み合わせて使用する、最初の大きな WPF MVVM アプリケーションに取り組んでいます。私が遭遇した問題は、このコマンドを ContextMenu のアイテムにバインドしたことです。これは常に無効になっています。
MenuItem のコード スニペットを次に示します。
<MenuItem
Header="Verwijderen"
Command="{StaticResource DeleteNoteCommandReference}"
CommandParameter="{Binding}" />
コマンドバインディングで行ったことは次のとおりです。ここで見つけた CommandReference というクラスを使用しました。
これはコマンドリファレンスそのものです:
<command:CommandReference
x:Key="DeleteNoteCommandReference"
Command="{Binding DeleteNoteCommand}" />
これを行った理由は、気づいた ContextMenu でのコマンド バインディングの問題のためです (ContextMenu が論理/ビジュアル ツリーの一部ではないという事実が原因です)。ネット上でこのテーマに関するいくつかのトピックを見つけました。そのうちのいくつかで CommandReference クラスを見つけました。これは私の問題に対する良い解決策のように思えました。これらのコマンドバインディングの問題は実際にはなくなりましたが、MenuItem が無効のままであるため、コマンドの CanExecute が認識されていないようです。
ViewModel (DataContext としてビューにバインドされている) には、次のコマンドのコードがあります。
/// <summary>
/// Command for deleting a note.
/// </summary>
public RelayCommand<NoteViewModel> DeleteNoteCommand {
get;
private set;
}
/// <summary>
/// CanExecute method for the DeleteNoteCommand.
/// </summary>
/// <param name="note">The NoteViewModel that CanExecute needs to check.</param>
/// <returns>True if the note can be deleted, false otherwise.</returns>
public bool DeleteNoteCommandCanExecute(NoteViewModel note) {
return Notes.Contains(note);
}
/// <summary>
/// Creates all commands for this ViewModel.
/// </summary>
private void CreateCommands() {
DeleteNoteCommand = new RelayCommand<NoteViewModel>(param => DeleteNote(param), param => DeleteNoteCommandCanExecute(param));
}
コードを機能させるために何が欠けていますか? 私が使用している CommandReference と関係があるのではないかと思いましたが、何を探すべきかわかりません。
皆さんが助けてくれることを本当に願っています!