问题描述:

在子线程中操作界面控件的数据源出现以下错误: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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐