[英]Binding Fails when Calling From Background Thread
您好,我在從后台線程更新綁定時遇到了一些麻煩。 在進行一些后台處理時,我正在顯示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>
您正在從非UI線程獲取當前的調度程序,並嘗試使用它。
雖然您可以從UI線程獲取並存儲當前的調度程序,然后在以后使用該調度程序,但是您真正應該做的就是讓Background Worker為您處理到UI線程的封送處理,如您所展示的如何工作例如,而不是嘗試手動編組到UI線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.