0

私は現在、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 と関係があるのではないかと思いましたが、何を探すべきかわかりません。

皆さんが助けてくれることを本当に願っています!

4

1 に答える 1

0

内部にブレークポイントを設定してDeleteNoteCommandCanExecute確認してみてください:

  1. コンテキストメニューを開く前に呼び出されている場合
  2. 内部のコードDeleteNoteCommandCanExecuteは例外をスローしません (例:noteパラメータが null である)

最初のケースで、それが呼び出されていない場合は、 でメソッドを呼び出して、InvalidateRequerySuggestedメソッドCommandManagerの再クエリを強制してみてくださいCanExecute

幸運を!

于 2011-08-21T19:58:30.330 に答える