不支持從調度程序線程以外的線程對其 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章