すべてのコマンドが次のパターンに従う Winforms UI を実装しているとします。
interface ICommand
{
bool CanExecute { get; }
void Execute();
}
このようなコマンドをトリガーするボタンまたはメニュー項目には、次の設定が必要です。
- プロパティ
Enabled
はコマンドのCanExecute
- イベント
Click
はコマンドにリンクされますExecute
(メソッド シグネチャが異なるため、中間イベント ハンドラーを介して)
問題CanExecute
INotifyPropertyChanged
は、このプロパティを直接変更することはできず、コマンドに関連する必要のないプログラム内の他の要因に依存するため、ここでは機能しないための実装です。PropertyChanged
また、プログラムのまったく無関係な部分でコマンドのイベントをトリガーする必要はありません。
が変更されたことをデータ バインディング マネージャーにどのように通知しますCanExecute
か?
これが私の問題の(純粋に架空の)例です:
bool CanExecute
{
get
{
return User.LoggedInForAtLeastNMinutes(5);
// how would you trigger data-binding updates for CanExecute?
}
}
理想的には、UI が (揮発性のフィールドであるかのように) 常にチェックするようにしたいのですCanExecute
が、これは Winforms のデータ バインディングの仕組みではありません。誰でもこの問題の解決策を持っていますか?
注:ところで、私はWPFを認識しています。私の質問の背景は、WPF の一般的な方向で既存の Winforms アプリケーションを徐々に改善しようとしているということです。しかし、実際にWPFを使用して、私が尋ねた問題を取り除くことは、今のところ実現不可能です。