Получение неинтерфейсных объектов для ответа на привязки команд WPF - PullRequest
2 голосов
/ 03 марта 2009

У меня есть класс ViewModel, который я хочу ответить на встроенную команду Refresh, которая запускается с кнопки, но я не уверен, как объявить CommandTarget.

Вкратце, мой код такой, как показано ниже

Конструктор ViewModel и обработчики событий CanExecute и Executed -

    public ViewModel()
    {
        CommandBinding binding = new CommandBinding(NavigationCommands.Refresh, CommandHandler);
        binding.CanExecute += new CanExecuteRoutedEventHandler(binding_CanExecute);
        binding.Executed += new ExecutedRoutedEventHandler(binding_Executed);
        CommandManager.RegisterClassCommandBinding(typeof(ViewModel), binding);
    }
    void binding_Executed(object sender, ExecutedRoutedEventArgs e)
    {
        Debug.Print("Refreshing...");
    }

    void binding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = true;
    }

Разметка -

<Button Command="Refresh">refresh</Button>

Теперь я попытался установить CommandTarget для этой кнопки на {Binding Source={StaticResource ViewModel}}, но я получил время выполнения, говорящее Cannot convert the value in attribute 'CommandTarget' to object of type 'System.Windows.IInputElement'.

Я новичок в командах, поэтому вполне возможно, что я здесь неправ. Любая помощь будет оценена.

1 Ответ

5 голосов
/ 03 марта 2009

RoutedCommand с и MVVM не смешиваются. RoutedCommand привязаны к визуальному дереву и опираются на коллекцию CommandBindings WPF. Вы должны реализовать свои собственные ICommand классы, которые работают с шаблоном MVVM. Взгляните на реализации Prism для начинающих.

В моих собственных проектах MVVM у меня есть пара реализаций команд:

  • DelegateCommand. Вызывает предоставленных делегатов, чтобы определить, может ли команда выполняться, и выполнить команду.
  • ActiveAwareCommand. Работает в сочетании с интерфейсом (IActiveAware) и отправляет выполнение команд текущему активному элементу. Несколько активных осведомленных реализаций регистрируются с помощью команды, и команда автоматически направляет CanExecute / Execute вызовы на текущий активный элемент.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...