我在一个单独的Task中收集数据,我希望使用ObservableCollection<>
将结果数据绑定到GUI组件。所以我的代码是这样的:
private ObservableCollection<MyItem> _items;
public ObservableCollection<MyItem> Items
{
get { return _items; }
set
{
if (_items.Equals(value))
{
return;
}
_items = value;
RaisePropertyChanged("Items");
}
}
private void LoadData()
{
Task task = Task.Factory.StartNew(() =>
{
ObservableCollection<MyItem> itms = _htmlParser.FetchData(...);
Dispatcher.CurrentDispatcher.Invoke((Action)delegate
{
Items = itms;
});
});
}
从执行某些HTTP请求的组件中获取数据。我得到的错误是:
Must create DependencySource on same Thread as the DependencyObject.
我正在使用MVVM Light工具包框架。我还尝试将结果作为消息发送,但最终出现在同一错误消息中。任何想法或指针?
编辑:这是问题:
public class MyItem
{
public string Id { get; set; }
public string Name { get; set; }
public BitmapImage Image { get; set; } // <--- A big No No because it inherits from the DependencyObject
public Uri Uri { get; set; }
}
我将BitmapImage
更改为byte[]
数据类型。
答案 0 :(得分:4)
您是否可以尝试将Dispatcher.CurrentDispatcher
替换为Application.Current.Dispatcher
,但不确定
答案 1 :(得分:1)
您获得的异常(“必须在与DependencyObject相同的线程上创建DependencySource”)表示正在后台线程上创建并在UI线程上使用的内容。是否有任何UI控件被创建并存储在集合中以供UI使用?
我看到ObservableCollection本身是在后台线程上创建的,但我不认为这是问题 - 不幸的是我不在办公室进行编码并确认。