Получение объектов, не относящихся к пользовательскому интерфейсу, для ответа на привязки команд WPF
Вопрос
У меня есть класс 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'
.
Я новичок в командах, так что вполне возможно, что я здесь во многом ошибаюсь.Любая помощь будет оценена по достоинству.
Решение
RoutedCommand
s и MVVM не смешиваются. RoutedCommand
привязаны к визуальному дереву и полагаются на WPF. CommandBindings
коллекция.Вы должны реализовать свои собственные ICommand
классы, работающие с шаблоном MVVM.Взгляни на Реализации Prism для начинающих.
В моих собственных проектах MVVM у меня есть несколько реализаций команд:
DelegateCommand
.Вызовы предоставляют делегатам, чтобы определить, может ли команда быть выполнена, и выполнить команду.ActiveAwareCommand
.Работает совместно с интерфейсом (IActiveAware
) и отправляет выполнение команд текущему активному элементу.Несколько активных реализаций регистрируются с помощью команды, и команда автоматически маршрутизируетCanExecute
/Execute
вызывает текущий активный элемент.