任务:
List绑定ObservableCollection
前置任务:
1.WebClient下载Json
2.反序列化json成对象
问题:
对象不能直接绑定到ListBox,需要重新组织一下对象
一.第一版本
var listBindModels = from model in apiModel.results
select new ListBindModel()
{
Title = model.obj.title,
AddTime = model.obj.addtime,
AvatarUrl = model.sender.avatar
};
ListSnapShot.ItemsSource = listBindModels;
二.引发异常
“Title”引发了“System.UnauthorizedAccessException”类型的异常'
kada~~这个情况我见多了。WP里面非UI线程修改UI线程就会这样,加一个
Deployment.Current.Dispatcher.BeginInvoke 就可以了,就像这样:
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
var listBindModels = from model in apiModel.results
select new ListBindModel()
{
Title = model.obj.title,
AddTime = model.obj.addtime,
AvatarUrl = model.sender.avatar
};
});
ListSnapShot.ItemsSource = listBindModels;
三.一样的异常
搞了一个小时没看出为什么
想了一下,LINQ是有延迟执行的,所以问题不是在LINQ语言,应该是下一句绑定上。
另外,绑定应该用ObservableCollection,但是LINQ出来的是IEnumerable,所以还要转化一下。
参考了一下网上的代码,最后这样:
IEnumerable To ObservableCollection :
public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> enumerableList)
{
if (enumerableList != null)
{
//create an emtpy observable collection object
var observableCollection = new ObservableCollection<T>();
//loop through all the records and add to observable collection object
foreach (T item in enumerableList)
observableCollection.Add(item);
//return the populated observable collection
return observableCollection;
}
return null;
}
List 绑定:
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
var listBindModels = (from model in apiModel.results
select new ListBindModel()
{
Title = model.obj.title,
AddTime = model.obj.addtime,
AvatarUrl = model.sender.avatar
}).ToObservableCollection();
ListSnapShot.ItemsSource = listBindModels;
});
这样的方法感觉比较笨,性能也不高,有待改进啊!