4

コマンドにバインドされた非常に単純なボタンがあります

    <Button Content="Add" Margin="10,10,10,0" Command="{Binding SaveCommand}" ></Button>

私のコマンドコード

    public ICommand SaveCommand
    {
        get;
        internal set;
    }

    private bool CanExecuteSaveCommand()
    {
        return DateTime.Now.Second % 2 == 0;
    }

    private void CreateSaveCommand()
    {
        SaveCommand = new DelegateCommand(param => this.SaveExecute(), param => CanExecuteSaveCommand());
    }

    public void SaveExecute()
    {
        PharmacyItem newItem = new PharmacyItem();
        newItem.Name = ItemToAdd.Name;
        newItem.IsleNumber = ItemToAdd.IsleNumber;
        newItem.ExpDate = ItemToAdd.ExpDate;
        PI.Add(newItem);
    }

コードは CanExecuteSaveCommand に基づいてコマンドの実行を効果的にブロックしますが、ボタンが無効になることはありません。これを実現する方法はありますか?

4

1 に答える 1

13

ICommand.CanExecute()コマンドの可用性が変更された可能性があると判断されるたびに、WPF によって自動的に呼び出されます。これは通常、キーボード イベント、フォーカス イベントなどのユーザー アクティビティに関係する傾向があります。

コマンドの可用性は純粋に時間に基づいて変化するため、WPF はそれが変化したことを推測する方法がありません。代わりに、呼び出してヒントを与える必要がありますCommandManager.InvalidateRequerySuggested();

コマンドの可用性は毎秒変化するため、この関数を少なくとも毎秒呼び出すようにタイマーを設定する必要があります。

InvalidateRequerySuggested()最も簡単な解決策ですが、WPF がすべてのコマンドの可用性を再評価することに注意してください。これがパフォーマンスの問題である場合は、代わりにインスタンスでCanExecuteChangedイベントを発生させることができます。ICommand

于 2014-05-09T08:16:29.893 に答える