Проблема с выводом обработчиков Command CanExecute и Executed из класса основного окна - PullRequest
2 голосов
/ 13 ноября 2011

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

2 голосов
/ 13 ноября 2011

Также взгляните на 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())));
    }
}
2 голосов
/ 13 ноября 2011

Посмотрите на http://www.wpftutorial.net/DelegateCommand.html пример того, как реализовать команду делегата для WPF.Это позволяет вам подключать Execute и CanExecute в качестве обработчиков событий.Если вы используете RoutedUICommand напрямую, вам нужно извлечь из него пользовательскую команду и переопределить Execute и CanExecute своими функциями.

...