134

階層内のMenuそれぞれに、定義した に設定されたプロパティがあります。associatedは、各 の有効な状態を制御する評価用のコールバックを提供します。MenuItemCommandRoutedCommandCommandBindingCanExecuteMenuItem

これはほとんど機能します。メニュー項目は、最初は正しい有効状態と無効状態で表示されます。ただし、CanExecuteコールバックが使用するデータが変更された場合、この新しい状態が UI に反映されるようにするには、コールバックから結果を再リクエストするコマンドが必要です。

RoutedCommandこれに関する、またはこれに対するパブリックメソッドはないようCommandBindingです。

コントロールをクリックまたは入力すると、コールバックが再び使用されることに注意してください(マウスオーバーでは更新されないため、入力時にトリガーされると思います)。

4

6 に答える 6

179

本の中で最もきれいではありませんが、CommandManager を使用してすべてのコマンド バインディングを無効にすることができます。

CommandManager.InvalidateRequerySuggested();

詳細については、MSDNを参照してください

于 2009-08-27T11:05:19.297 に答える
85

後でこれに出くわした人のために。MVVM と Prism を使用している場合は、Prism のDelegateCommand実装により、これを行う方法がICommand提供さ.RaiseCanExecuteChanged()れます。

于 2011-06-17T16:49:45.803 に答える
30

CommandManager.InvalidateRequerySuggested();パフォーマンスが低下していたため、 使用できませんでした。

以下のようなMVVM Helperの Delegating コマンドを使用しました (要件に合わせて少し調整しました)。command.RaiseCanExecuteChanged()VMから呼び出す必要があります

public event EventHandler CanExecuteChanged
{
    add
    {
        _internalCanExecuteChanged += value;
        CommandManager.RequerySuggested += value;
    }
    remove
    {
        _internalCanExecuteChanged -= value;
        CommandManager.RequerySuggested -= value;
    }
}

/// <summary>
/// This method can be used to raise the CanExecuteChanged handler.
/// This will force WPF to re-query the status of this command directly.
/// </summary>
public void RaiseCanExecuteChanged()
{
    if (canExecute != null)
        OnCanExecuteChanged();
}

/// <summary>
/// This method is used to walk the delegate chain and well WPF that
/// our command execution status has changed.
/// </summary>
protected virtual void OnCanExecuteChanged()
{
    EventHandler eCanExecuteChanged = _internalCanExecuteChanged;
    if (eCanExecuteChanged != null)
        eCanExecuteChanged(this, EventArgs.Empty);
}
于 2011-12-12T13:30:07.827 に答える
2

コマンドのプロパティの依存関係を処理するソリューションを実装しました。リンクはhttps://stackoverflow.com/a/30394333/1716620です。

そのおかげで、次のようなコマンドが得られます。

this.SaveCommand = new MyDelegateCommand<MyViewModel>(this,
    //execute
    () => {
      Console.Write("EXECUTED");
    },
    //can execute
    () => {
      Console.Write("Checking Validity");
       return PropertyX!=null && PropertyY!=null && PropertyY.Length < 5;
    },
    //properties to watch
    (p) => new { p.PropertyX, p.PropertyY }
 );
于 2015-05-22T10:37:52.690 に答える
-3

これが私にとってうまくいったことです:XAMLのコマンドの前にCanExecuteを置きます。

于 2019-03-11T16:55:59.127 に答える