2

这是我在取自 ThreadPool 的单独线程中将项目添加到 ObservableCollection 的方法。

我们知道它会引发异常:

This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread.

我知道这个主题在这里很受欢迎,但我还没有找到任何适合下面代码中描述的情况的解决方案:

namespace WpfApplication1
{
    class Item
    {
        public string name
        {
            get;
            set;
        }
    }

    class Container
    {
        public ObservableCollection<Item> internalList = new ObservableCollection<Item>();

    }

    public partial class MainWindow : Window
    {
        Container container = new Container();

        void addItems()
        {
            Item item = new Item() { name = "jack" };
            container.internalList.Add(item);

        }

        public MainWindow()
        {
            InitializeComponent();

            ThreadPool.QueueUserWorkItem(delegate { this.addItems(); });
            MyDataGrid.ItemsSource = container.internalList;

        }
    }
}

这个问题的最佳解决方案是什么?

谢谢!

4

4 回答 4

3

代替

container.internalList.Add(item);

经过

Dispatcher.BeginInvoke(new Action(() => container.internalList.Add(item)));

这样在线程Add上执行。Dispatcher

于 2013-09-09T11:02:18.667 回答
1

您可以从后台线程获取数据作为 aList然后将此列表转换为 aObservableCollection如下

List<SomeViewModel> someViewModelList = await GetYourDataAsListAsync();
ObservableCollection<SomeViewModel> Resources = new TypedListObservableCollection<SomeViewModel>(someViewModelList);

我希望这有帮助。

于 2013-09-09T10:58:13.223 回答
1

确保在 UI 线程上设置 UI 对象的属性:

Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Normal, (Action)delegate()
{
    MyDataGrid.ItemsSource = container.internalList;
});

这会将花括号内的代码添加到 UI 线程的工作项队列中Dispatcher

于 2013-09-09T11:01:15.727 回答
1

问题不在您的类上的集合中,而是在从 UI 线程绑定到此集合的控件中。

WPF 4.5 中有一些新内容:http: //www.jonathanantoine.com/2011/09/24/wpf-4-5-part-7-accessing-collections-on-non-ui-threads/

//在某处创建锁对象
private static object _lock = new object();

//在别处启用对这个集合的交叉访问
BindingOperations.EnableCollectionSynchronization(_persons, _lock);

MSDN: http: //msdn.microsoft.com/en-us/library/hh198845 (v=vs.110).aspx

于 2013-09-09T11:12:58.863 回答