Проблема с выводом обработчиков Command CanExecute и Executed из класса главного окна
В основном у меня есть привязка команды для самой команды, назначенной для Window.CommandBindings:
<CommandBinding Command="local:TimerViewModel.AddTimer"
CanExecute="local:TimerViewModel.AddTimer_CanExecute"
Executed="local:TimerViewModel.AddTimer_Executed" />
local - это пространство имен, сгенерированное по умолчанию и указывающее на пространство имен приложения. Здесь я пытаюсь добиться обработки команд внутри TimerViewModel, но постоянно получаю следующую ошибку:
CanExecute = "local: TimerViewModel.AddTimer_CanExecute" недопустим. 'local:TimerViewModel.AddTimer_CanExecute' не является допустимым именем метода обработчика событий. Допустимы только методы экземпляра в сгенерированном классе или классе с выделенным кодом.
TimerViewModel довольно прост, но я думаю, что что-то упустил:
public class TimerViewModel : ViewModelBase
{
public TimerViewModel()
{
_timers = new ObservableCollection<TimerModel>();
_addTimer = new RoutedUICommand("Add Timer", "AddTimer", GetType());
}
private ObservableCollection<TimerModel> _timers;
public ObservableCollection<TimerModel> Timers
{
get { return _timers; }
}
private static RoutedUICommand _addTimer;
public static RoutedUICommand AddTimer
{
get { return _addTimer; }
}
public void AddTimer_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
public void AddTimer_Executed(object sender, ExecutedRoutedEventArgs e)
{
_timers.Add(new TimerModel(TimeSpan.FromSeconds((new Random()).Next())));
}
}
Кто-нибудь может указать на ошибки, которые я делаю?
2 ответа
Также взгляните на RelayCommand Джоша Смита. Использование этого позволит вам написать выше, как это:
public class TimerViewModel : ViewModelBase {
public TimerViewModel() {
Timers = new ObservableCollection<TimerModel>();
AddTimerCommand = new RelayCommand(() => AddTimer());
}
public ObservableCollection<TimerModel> Timers {
get;
private set;
}
public ICommand AddTimerCommand {
get;
private set;
}
private void AddTimer() {
Timers.Add(new TimerModel(TimeSpan.FromSeconds((new Random()).Next())));
}
}
Посмотрите на http://www.wpftutorial.net/DelegateCommand.html пример того, как реализовать команду делегата для WPF. Это позволяет подключать Execute и CanExecute в качестве обработчиков событий. Если вы используете RoutedUICommand напрямую, вам нужно извлечь из него пользовательскую команду и переопределить Execute и CanExecute своими функциями.