1

次のようなコマンドの execute メソッドがあるとします。

    private void Execute()
    {
        // Bound to a wait indicator in the UI
        Searching = true;

        // Do some long running process
        Thread.Sleep(2000);

        Searching = false;
    }

Searching が True に設定されている場合、それがバインドされている UI 要素は更新されません (Searching が OnPropertyChanged 呼び出しを送信しても)。

ただし、Thread.Sleep が完了すると、UI は変更を処理し、Searching がバインドされていることを示す待機インジケーターを表示します。

これで、長時間実行されるプロセス (Thread.Sleep) の呼び出しを非同期にすることが従来の知恵であることがわかりました。

しかし、非同期ライブラリを使用していないと仮定すると、WPF に今すぐ検索でバインディングを実行するように指示する方法はありますか?

このようなもの:

    private void Execute()
    {
        // Bound to a wait indicator in the UI
        Searching = true;

        // MADE UP CODE
        Binding.UpdateBindingNow("Searching");
        // END MADE UP CODE


        // Do some long running process
        Thread.Sleep(2000);

        Searching = false;
    }

更新:私が試したこと:

  • Dispatcher を使用して、コマンドを UI に個別に送信してみます。
  • Dispatcherも優先度を高くしてみました。
4

2 に答える 2

5

作業をバックグラウンド スレッドにプッシュする必要があります。バインディングは、UI スレッドがメッセージを処理できるようになるまで更新されません。これは、操作が完了するまで行われません。

非同期は 1 つのアプローチですが、より古典的なアプローチはBackgroundWorker、WPF のすべてのバージョンでサポートされている、これを行うために使用することです。

.NET 4 を使用している場合は、TPL を介してこれを行うこともできます。

private void Execute()
{
    // Bound to a wait indicator in the UI
    Searching = true;

    Task.Factory.StartNew( () => { 
        // Do long running work... 
    }).ContinueWith(t =>
    {
        // You can do work here, including touching UI controls/collections/etc
        Searching = false;
    }, TaskScheduler.FromCurrentSynchronizationContext());
}
于 2013-03-04T21:33:35.717 に答える
1

長時間実行されるプロセスをバックグラウンド/非同期操作に移行することが最善の方法であるという他の人たちの意見に同意します。UI がユーザーに対してフリーズしないことと、UI スレッドがブロックされるため、実行時間の長いプロセスが動作している間は、何をしても (バインディングを更新するなど) 実際には UI に反映されないためです。

そうは言っても、あなたの質問は、バインディングをコードから評価/更新するように強制できるかということであり、答えはイエスです。UpdateTargetこれを行うには、次のBindingExpressionようにを呼び出します。

labelTextBlock.GetBindingExpression(TextBlock.TextProperty).UpdateTarget();

には、ターゲットではなくソースにのみ影響を与える、ほぼ同じ方法で使用できるUpdateSourceメソッドもあります。BindingExpression

繰り返しますが、UI スレッドがブロックされている場合、期待どおりの結果が得られない可能性がありますが、これはバインドを強制的に再評価する方法です。

于 2013-03-04T21:42:07.137 に答える