2

基本上,我为分配给 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())));
    }
}

谁能指出我犯的错误?

4

2 回答 2

2

查看http://www.wpftutorial.net/DelegateCommand.html以获取有关如何为 WPF 实现委托命令的示例。它允许您连接 Execute 和 CanExecute 作为事件处理程序。如果您直接使用 RoutedUICommand,则需要从中派生自定义命令并使用您的函数覆盖 Execute 和 CanExecute。

于 2011-11-13T16:57:05.757 回答
2

另请查看 Josh Smith 的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())));
    }
}
于 2011-11-13T17:13:33.193 回答