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

WPF のデリゲート コマンドを実装する方法の例については、http://www.wpftutorial.net/DelegateCommand.htmlをご覧ください。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 に答える