Windows phone通过linq创建ObservableCollection绑定

来源:互联网 发布:圆形沉井计算软件 编辑:程序博客网 时间:2024/06/06 05:28

任务:       

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;                    });


这样的方法感觉比较笨,性能也不高,有待改进啊!