Почему мой элемент ContextMenu, связанный с RelayCommand, всегда отключен? - PullRequest
0 голосов
/ 21 августа 2011

Сейчас я работаю над своим первым большим приложением WPF MVVM, которое использует MVVM Light Toolkit в сочетании с RelayCommand Джоша Смита.Проблема, с которой я сталкиваюсь, заключается в том, что я привязал эту команду к элементу в ContextMenu, который постоянно отключен.

Вот фрагмент кода MenuItem:

<MenuItem
    Header="Verwijderen"
    Command="{StaticResource DeleteNoteCommandReference}"
    CommandParameter="{Binding}" />

Что теперьЯ сделал с привязкой команд следующее: я использовал класс с именем CommandReference, который я нашел здесь .

Это сама ссылка на команду:

<command:CommandReference
    x:Key="DeleteNoteCommandReference"
    Command="{Binding DeleteNoteCommand}" />

причина, по которой я это сделал, заключается в проблемах с привязкой команд в ContextMenu, которые я заметил (вызванных тем, что ContextMenu не является частью логического / визуального дерева).Я нашел несколько тем на эту тему в сети, и в некоторых из них я обнаружил класс CommandReference, который казался хорошим решением моей проблемы.Эти проблемы с привязкой команд действительно исчезли, но кажется, что CanExecute моей команды не распознан или что-то еще, потому что MenuItem остается отключенным.

В 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, который я использую, но я не знаю, что искать.

Очень надеюсь, что вы, ребята, можете помочь!

1 Ответ

0 голосов
/ 21 августа 2011

Попробуйте установить точку останова внутри DeleteNoteCommandCanExecute и проверить:

  1. , вызывается ли она перед открытием контекстного меню, а
  2. код внутри DeleteNoteCommandCanExecute не делаетвыбросить исключение (например, note параметр, имеющий значение null)

В первом случае, если он не вызывается, попробуйте вызвать метод InvalidateRequerySuggested в CommandManager, чтобы вызвать запросCanExecute метод.

Удачи!

...