問題描述:
在子線程中操作界面控件的數據源出現以下錯誤: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