2010-12-06 14 views
0

同じウィンドウ内のデータグリッドを更新するトップレベルのメニュー項目があります。私の現在の制御の流れは次のとおりです。クリックイベントハンドラでリフレッシュ WPF toplevel MenuItemタスクに基づいて有効/無効を切り替えます

    1. ユーザーをクリックすると、I:
      1. oMenuItem.IsEnabled = falseを設定することで、メニュー項目を無効にします。
      2. は、グリッドをリフレッシュするための行動を派遣し、その行動に、私はメニューアイテムを再度有効にするには、問題は、それが無効になっていても、ユーザーが更新する]をクリックできることですIsEnabled = true

    を設定することによって、それがようですクリックがキューに入れられた場合アクションが戻ると、残りの「キューアップ」されたクリックを処理します。私が期待しているのは、menuitemが無効になっている間のすべてのクリックは無視され、有効になっている場合のみクリックが確認されます。

    奇妙なことは、私はちょうどすなわち、それを無効にし、決してそれがそのようにとどまることを可能にするならば、それは

  • 答えて

    1

    「派遣アクション」あなたはDispatcher.BeginInvoke(呼び出すことによって意味、disabled.wpfであるということである)、または他の種類の非同期オペレーション?

    いずれにせよ、どちらの場合でも、操作(DispatcherOperationまたはIAsyncResult)に対する「ハンドル」を取得し、操作をディスパッチするときにフィールドとして格納できます。完了したら、このフィールドをnullに設定します。

    メニュー項目のクリックイベントハンドラでこのフィールドをチェックします。 nullの場合、操作を開始するのが安全であることを意味します。 nullでない場合は、すぐに戻り、何もしません。

    あなたの質問には関係がありませんが重要なのは、なぜコマンドを使用しないのですか?そうすれば、イベントの処理や有効化/無効化を行う必要はありません。もちろん、コマンドは複数の手段で呼び出すことができます(たとえば、ユーザーがキーボードを使用してメニューからコマンドを選択し、Enterキーを押すと、マウスはクリックされませんが、メニュー項目をクリックするのと同じ操作を行う必要があります)。

    アレックス。

    +0

    こんにちは。応答していただきありがとうございます。私はCommandメソッドも使いましたが、CanExecuteハンドラでは、MenuItemのIsEnabledプロパティがfalseであるかどうかをチェックしました。本質的に、e.CanExecute = oMenuItem.IsEnabled。これは以前の非IAsyncResultアプローチと同じ動作でした。私はあなたのアプローチに一発を与え、うまくいけばこれを理解していきます。 – Anuj

    +1

    コマンドを使うことは、それらをViewModelの中に置くことができ、したがってロジックからのプレゼンテーションを分離できることです。私が何を話しているのかわからない場合は、Google MVVM (簡単に言うと、すべてのコントロールでウィンドウを表示することなく、ロジックを簡単なクラスとしてテストすることができます)。 MVVMを使用する場合は、IAsyncResultフィールドをViewModelに保存し、ビューには保存しないでください。 – Alex

    関連する問題