Windows phone通过linq创建ObservableCollection绑定

任务:       

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


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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值