1. ホーム
  2. wpf

WPFコマンドのリフレッシュ

2023-12-22 03:04:20

質問

誰か CanExecute をカスタムコマンドで呼び出す方法を知っている人はいますか? RelayCommand )?

典型的なのは CanExecute は UI 上でインタラクションが発生するたびに呼び出されます。何かをクリックすると、コマンドが更新されます。

の条件が CanExecute の条件が、裏でタイマーによってオン/オフされている状況があります。これはユーザーのインタラクションによって駆動されていないため CanExecute は、ユーザーが UI と対話するまで呼び出されません。その結果、私の Button は、ユーザーがクリックするまで有効/無効のままです。クリックされた後は、正しく更新されます。時々 Button が有効に表示されても、ユーザがクリックすると発火せずに無効に変化する。

タイマがに影響するプロパティを変更したときに、コード内で強制的に更新するにはどうしたらよいでしょうか。 CanExecute ? 私は PropertyChanged ( INotifyPropertyChanged ) に影響するプロパティで CanExecute を追加しましたが、それは役に立ちませんでした。

XAMLの例です。

<Button Content="Button" Command="{Binding Cmd}"/>

後ろのコード例

private ICommand m_cmd;
public ICommand Cmd
{
    if (m_cmd == null)
        m_cmd = new RelayCommand(
            (param) => Process(),
            (param) => EnableButton);

    return m_cmd;
}

// Gets updated from a timer (not direct user interaction)
public bool EnableButton { get; set; }

どのように解決するのですか?

呼び出し System.Windows.Input.CommandManager.InvalidateRequerySuggested() を呼び出すと、CommandManagerはRequerySuggestedイベントを発生するように強制します。

備考 CommandManagerは、キーボードフォーカスの変化など、コマンドのターゲットが変化したときの判断において、特定の条件のみに注目します。CommandManagerがコマンドを実行できない原因となる条件の変化を十分に判断しない状況では、InvalidateRequerySuggestedを呼び出して、CommandManagerにRequerySuggestedイベントを発生させることができます。