0

これはばかげた質問のように思えますが、プリズムのドキュメントを調べてインターネットを検索しましたが、例が見つかりません...これが契約です。

Prism で DelegateCommand を使用しています。デリゲートを CanExecute メソッドに実行できるように割り当てた場合を除いて、正常に動作しています。別のビューモデルでは、私も公開しているboolを取るイベントがあり、イベントが発生していて、boolがコマンドを含むビューモデルに問題なく渡されていることがわかりますが、これは私がしていることですわからない... 状態が変化したことをどのように知ることができますか? 例のコードを次に示します。

ビューモデルセンターから

eventAggregator.GetEvent<NavigationEnabledEvent>().Subscribe(OnNavigationEnabledChange, ThreadOption.UIThread);

NavigateCommand = new DelegateCommand(OnNavigate, () => nextButtonEnabled);

さて、これが OnNavigationEnableChange イベントです。

private void OnNavigationEnabledChange(bool navigationState)
    {
      nextButtonEnabled = navigationState;
    }
enter code here

同様に-ここで何かが完全に欠けています-コマンドは、nextButtonEnabledが真ではないことをどのように認識しますか?

誰かが素晴らしい実例を教えてくれたら。

わかりました - ありがとう!

4

2 に答える 2

0

DelegateCommandこれが、私がPrismでの実装を使用しない理由です。コマンドを有効/無効にするためのコールバックベースのアプローチは、私はいつも嫌いでした。それは完全に不必要であり、私が知る限り、その唯一の(そしてかなり疑わしい)「利点」は、実行自体の処理方法と一貫していることです。しかし、実行と有効化/無効化は明らかに大きく異なるため、それは私には常に無意味に思えました。ボタンはコマンドを実行するタイミングを認識していますが、コマンドのステータスがいつ変更されたかはわかりません。

だから私はいつも次のようなものを書くことになります:

public class RelayCommand : ICommand
{
    private bool _isEnabled;
    private Action _onExecute;

    public RelayCommand(Action executeHandler)
    {
        _isEnabled = true;
        _onExecute = executeHandler;
    }

    public bool IsEnabled
    {
        get { return _isEnabled; }
        set
        {
            _isEnabled = value;
            if (CanExecuteChanged != null)
            {
                CanExecuteChanged(this, EventArgs.Empty);
            }
        }
    }


    public bool CanExecute(object parameter)
    {
        return _isEnabled;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        _onExecute();
    }
}

(必要に応じて、Prism のように変更イベント ハンドラーを実行するために弱参照を使用するようにこれを変更できます。)

しかし、あなたの質問に答えるために: コールバック アプローチはどのように機能するのでしょうか? PrismDelegateCommandは、RaiseCanExecuteChangedコマンド呼び出し元がコマンドのCanExecute. 有効なステータスが変更されるたびに通知する必要があることを考えるとDelegateCommand、コールバック ベースのアプローチに意味のある利点はないと思います。(ただし、ブロードキャスト モデルが見られることもあります。状況の変化がすべてのコマンド呼び出し元に通知されるように配置されています。その場合、実際に何が変化したかを知らなくても問題ないことを意味するため、コールバックが役立ちます。しかし、再クエリすべてのコマンドが不快に思えます。)

于 2010-12-03T08:52:30.973 に答える
0

あなたの質問に答えると、コマンドは現在有効になっていることをどのように認識しますか:

NavigateCommand = new DelegateCommand(OnNavigate, () => nextButtonEnabled);

DelegateCommand コンストラクターのこのオーバーロードは、2 つのパラメーターを取ります。1 つ目はコマンド アクションで、2 つ目は bool を返す CanExecute デリゲートです。あなたの例では、 CanExecute アクションは常に戻りますnextButtonEnabled

eventAggregator.GetEvent<NavigationEnabledEvent>().Subscribe(OnNavigationEnabledChange, ThreadOption.UIThread);

これがどのように機能するかOnNavigationEnabledChangeを変更するトリガー...nextButtonEnabled

于 2010-12-04T05:11:24.377 に答える