2016-08-09 4 views
0

をクリックします。 プリズムは使用していません。 は今、私はボタンがクリックされたときに無効/ UI上の特定のコントロールを非表示にします。を無効に複数のGUIコントロール私はUIのボタンにDelegateCommandsをバインド

は、私がDelegateCommand自体の実行ハンドラに無効化/非表示ロジックを配置する必要がありますか? ここでは特に焦点を当てています:背景ワーカースレッド。

this.MyCommand = new DelegateCommand(MyExecutehandler); 

    void MyExecutehandler(object obj){ 
    // 1.) disable controls here 
    // 2.) long running operation on background worker here 
    // 3.) enable the controls again in the worker_completed handler? 
    } 

コントロールは、MVVMで無効/有効になります。

+1

提案。 BGワーカーの代わりに 'async await'を試してみてください。そして、私はdelegateコマンドの実行ハンドラでディスエーブルロジックを記述する際に間違ったことは見つけられません。 – ViVi

+0

Hm、はい純粋なMVVMであれば、これもうまくいくはずです。私は純粋なMVVMでディスパッチャを利用できないためです。 – Legends

+0

これは誤解です。純粋なMVVMでも 'Dispatcher'を使うことができます。 :) – ViVi

答えて

0

あなたがここに

+0

見ました。しかし、あなたのアプローチは、UIフレームワークへの依存関係を作り出すでしょう...だから、boolはコンバータと一緒に行く方法です – Legends

1

特別フォーカスvisibility.collapseし無効とMyExecutehandler機能設定プロパティ値にしたいコントロールの可視性プロパティをバインドすることができますので、私はちょうど行い、バックグラウンドワーカースレッド

を別のスレッドからUIコントロールの状態を変更する方法を尋ねているという前提です。

通常、我々は

this.Dispatcher.BeginInvoke(<your delegate here>) 

ワーカースレッドからUIスレッドの制御を変更する方法下記の使用しかし、私はあなたが「この」としてバックグラウンドワーカースレッドで主に異なることができないことと思われます。だから、あなたはこれを試すことがあります。

button.Dispatcher.BeginInvoke(new Action(()=> 
{ 
//disable button here 
})); 

これは、デリゲートを実行するためにUIスレッドを指示するメッセージを送信するワーカースレッドのようなものです。

もう一つ、通常、我々はコントロールを無効にし、いくつかの不要な添付イベント/にPropertyChangedイベントを避けるために、いくつかの工程の後にボタンを再度有効にします。希望このことができますその

button += button_click_event 

button -= button_click_event 

と再追加イベント:

あなたは一時的にイベントを削除することであることに行うことができます。だから私はあなたがこれを必要とするかもしれ疑い。

関連する問題