首页 > 解决方案 > 为什么从 UI 线程调用的 ConfigureAwait(false) 对 UI 更新的 XAML 绑定属性起作用?

问题描述

在我后面的代码中,我有一个按钮单击事件处理程序来执行一些ConfigureAwait(false)以 Task 为后缀的 IO 工作。

现在我希望当async任务完成时,它不会在 UI 线程上恢复。因此,TxtStatus.Text分配预计会失败,而且确实如此。

问题是,如果这个 TextBox 是使用实现的模型绑定的,INotifyPropertyChanged那么它可以工作并且 UI 会更新。

为什么这可能,UI更新不应该失败吗?

以下代码片段是我当前的代码,其中包含足够的详细信息来确定我的问题的上下文。

看法

<TextBox Name="TxtStatus" Text="{Binding Model.Status, Mode=TwoWay}/>

View 的 CodeBehind

private async void Button_Click(object sender, RoutedEventArgs e)
{        
    await _viewModel.DoWorkAsync().ConfigureAwait(false);

    //TxtStatus.Text = "This does not work.";

    _viewModel.Model.Status= "This works.";            
}

模型

public class MyModel : INotifyPropertyChanged
{
    private string _status;
    public string Status
    {
        get => _status;
        set 
        { 
            _status= value; 
            OnPropertyChanged(); 
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged([CallerMemberName]string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

标签: c#wpfdata-bindingasync-await

解决方案


推荐阅读