不支持从调度程序线程以外的线程对其 SourceCollection 进行的更改
·
问题描述:
在子线程中操作界面控件的数据源出现以下错误:System.NotSupportedException:“该类型的 CollectionView 不支持从调度程序线程以外的线程对其 SourceCollection 进行的更改。”
如图所示:
例:
界面中先声明一个ListView控件,然后绑定数据源:
<ListView Grid.Row="1" FontSize="20" ItemsSource="{Binding LogList}"></ListView>
在ViewModel中操作数据源:
private ObservableCollection<string> _logList = new ObservableCollection<string>();
public ObservableCollection<string> LogList
{
get
{ return _logList; }
set
{
_logList = value;
RaisePropertyChanged("LogList");
}
}
public ICommand DoImportDataCmd { get; }
public MainWindowViewModel()
{
DoImportDataCmd = new RelayCommand(DoImport);
}
private Task DoWork()
{
return Task.Factory.StartNew(Test); //因为数据处理的耗时操作开启的Task线程
}
private void Test()
{
LogList.Add(string.Format("表导入数据出错!"));//在此处对ListView数据源进行数据添加时报错。
}
private async void DoImport()
{
await DoWork();
}
解决办法:
在操作界面控件的数据源时回归UI线程进行操作,如下所示:
private void Test()
{
System.Windows.Application.Current.Dispatcher.Invoke((Action)(() =>
{
LogList.Add(string.Format("表导入数据出错!"));
}));
}
参考:https://www.cnblogs.com/Soviet/p/6834670.html
更多推荐


所有评论(0)