(我使用 .Net 4.5 和 Visual Studio 2017。在帖子末尾添加了最小示例链接,如果您想自己查看这些内容,可以运行/崩溃而无需做任何事情)
我有一个包含 WPF 中的 DataGrid 的 UserControl。它绑定到包含 DataTable 和自定义列列表的 Viewmodel,以便在我目前无法删除它们时隐藏其中的一些。
DataGrid.Columns 是只读的,所以在 UserControl.DataContextChanged(我在下面解释原因)中,我得到了新的 DataContext,清除了我的 grid.Columns 集合,并用我在加载时读取的 DataGridColums 的自定义列表提供给它。
最初,我正在做一个同步加载。一切运行良好(我正在加载很多东西,包括这些项目的列表)。但是我已经把加载放到了一个后台工作程序中(运行得几乎没有问题),后来,使用 Task.Run() 将后台工作程序替换为异步加载。
我窗口中的所有其他项目列表都加载得很好,代码运行良好。但是当我试图用其他的替换 mygrid.Columns 时,我有一个 InvalidOperationException 说调用线程无法访问这个对象,因为另一个线程拥有它。
我尝试了很多东西,很多来自 myGrid.Dispatcher 的 BeginInvoke、App 的当前 Dispatcher 等等,以及我找到的每一段异步代码,但我不知道如何向这个 ObservableCollection 添加一个简单的项目。
我见过自定义 asyncObservableCollection 但不能使用它们,DataGrid.Columns 是只读的。
我对我认为 UserControl_DataContextChanged 属于 UI 线程这一事实感到困惑,因此它应该能够安全地更改用户控件。
我在这里上传了一个“最小示例”=> https://files.fm/u/k2srba6m 问题出在 ItemViewmodel.FilterColumns 中,就像我的原始代码一样(希望这个解决方案也适用于原始代码)
任何帮助将不胜感激(对不起我的英语)