您好我从后台线程更新绑定时遇到了一些麻烦。我正在显示一个IsBusy指标,同时进行一些后台处理,然后在完成时隐藏指标。
请注意,如果我在后台工作程序中将IsLoading设置为false(但通过在UI线程上调用它),它就不会更新UI。
如果我在UI线程之后立即调用它。它有效。
我错过了什么?
private void BeginValidation()
{
m_ValidationWorker = new BackgroundWorker();
m_ValidationWorker.WorkerReportsProgress = false;
m_ValidationWorker.DoWork += (_sender, _args) =>
{
foreach (DataRecord record in DatabaseViewModel.Instance.Records)
{
record.Init();
Application.Current.Dispatcher.Invoke(()=> { record.IsLoading = false; }); //THIS DOESN'T WORK
}
};
m_ValidationWorker.RunWorkerCompleted += (_sender, _args) =>
{
foreach (DataRecord record in DatabaseViewModel.Instance.Records)
{
record.IsLoading = false;//THIS WORKS
}
};
m_ValidationWorker.RunWorkerAsync();
}
而xaml仅供参考。
<telerik:RadBusyIndicator IsBusy="{Binding FirstRecord.IsLoading}" IsIndeterminate="True" DisplayAfter="0" BusyContent="Processing" Style="{StaticResource RadBusyIndicatorStyle}">
<Grid>
<ScrollViewer HorizontalScrollBarVisibility="Disabled" Padding="5">
<ItemsControl ItemsSource="{Binding FirstRecord.Fields}" ItemTemplateSelector="{StaticResource FormView_TypeSelector}"/>
</ScrollViewer>
</Grid>
</telerik:RadBusyIndicator>
答案 0 :(得分:0)
您从非UI线程获取当前调度程序,并尝试使用它。
虽然您可以从UI线程获取并存储当前的调度程序,然后稍后使用该调度程序,但您真正要做的就是让后台工作程序为您处理封装线程,因为您展示了如何操作在您的工作示例中,而不是尝试手动编组到UI线程。