Получение объектов, не относящихся к пользовательскому интерфейсу, для ответа на привязки команд WPF

StackOverflow https://stackoverflow.com/questions/606115

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть класс ViewModel, который я хочу реагировать на встроенную команду «Обновить», которая запускается с помощью кнопки, но я не уверен, как объявить 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'.

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

Это было полезно?

Решение

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

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

  • DelegateCommand.Вызовы предоставляют делегатам, чтобы определить, может ли команда быть выполнена, и выполнить команду.
  • ActiveAwareCommand.Работает совместно с интерфейсом (IActiveAware) и отправляет выполнение команд текущему активному элементу.Несколько активных реализаций регистрируются с помощью команды, и команда автоматически маршрутизирует CanExecute / Execute вызывает текущий активный элемент.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top