告诉WPF评估绑定

Vac*_*ano 1 .net c# wpf binding

假设我有一个命令的执行方法,如下所示:

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

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

        Searching = false;
    }
Run Code Online (Sandbox Code Playgroud)

当Searching设置为True时,绑定的UI元素将不会更新(即使Searching发送OnPropertyChanged调用).

但是,一旦Thread.Sleep完成,然后UI处理我的更改并显示搜索绑定的等待指示符.

现在,我知道传统的智慧是使对长时间运行的进程(Thread.Sleep)的调用是异步的.

但是假设我没有使用Async库,有没有办法指示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;
    }
Run Code Online (Sandbox Code Playgroud)

更新:我尝试过:

  • 使用Dispatcher尝试将命令单独发送到UI.
  • 我还尝试了优先级高的Dispatcher.

Ree*_*sey 5

您需要将工作推送到后台线程.在UI线程可以处理消息之前,绑定不会更新,直到操作完成才会发生.

Async是一种方法,但更经典的方法是使用它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());
}
Run Code Online (Sandbox Code Playgroud)