我正在一个单独的任务中收集数据,并且我想要使用ObservableCollection<>
将结果绑定到GUI组件。所以我的代码如下所示:如何处理MVVM中并行化任务的ObservableCollection <>结果?
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[]
数据类型。
如果您的任务应该在后台进行,以便它不会锁定UI,那么看起来很奇怪,您所做的第一件事是回调到UI线程 - 这不会阻止所有UI输入_htmlParser正在获取数据? – 2010-09-02 09:26:53
@马丁,你正在提出一个非常好的观点。当我把问题放在一起时,我很快简化了代码。我现在用更好的代码流更新了这个问题。 – 2010-09-02 10:04:02