——最近在做UWP开发,其中请求API数据的时候,往往是通过异步请求网络,再处理json数据,返回集合对象。通常,我们的做法是将集合数据在ViewModel层进行处理,让ViewModel实现ObservableCollection接口,然后在View层后台实例化ViewModel对象,前台绑定对象。这样就实现了集合的绑定和通知。这里需要注意,集合的绑定,不单单是绑定,而且要实现绑定通知,才算真正的绑定。
为什么这么说呢?看一下在开发中遇到的问题:
由于一个简单的页面,需要绑定一组集合数据,因为这个界面过于简单,我觉得麻烦,就没有“按套路出牌”,即没有通过ViewModel层实现集合通知。而是通过list直接绑定到界面,后台代码如下,其中通过页面的OnNavigationTo方法用集合list接收异步方法返回的集合数据。
在前台绑定list。这样按理来说,就完成了集合的绑定。但是,结果是不行的。数据并没有显示在界面上。
那么,List集合是不能绑定到前台显示的吗?
于是我去问一另一位搞uwp开发大神-Script,结果他做了一个测试,而且显示List集合是可以绑定到界面上的,如下图:
在OnNavigationTo方法里模拟获取集合,在构造函数里初始化。结果显示绑定成功了!界面上可以正常显示。
那么问题来了,为什么我的绑定不成功呢?
细心的话,可以看到,我的数据请求用的是异步返回数据的方法。而Script大神一开始测试用的是同步,当Script大神将自己的方法改为异步后:
是的,数据绑定失效了。
问题就是出在了异步和同步。那么,为什么同样是list集合,异步方法,绑定会失效,而同步方法的话绑定就可以呢?
其实,还是因为自己没弄清数据绑定的实质,前面说了,数据绑定, 不仅仅是绑定,还要实现数据的变更通知。
同步方法在执行时,会卡在OnNavigationTo方法那里,直到返回数据,才进入界面。当进入界面时,此时,list里面已经有了数据。所以,在前台就可以看到绑定的数据。
异步方法在执行时,会异步加载数据,同时不影响绑定的进行,也就是说,在数据还没有返回的时候,绑定已经完成了,也进入界面了,list此时的值还是null,因为异步方法此时还没有返回数据,而此时,前台就显示的没有内容,当异步方法执行完毕,返回集合数据的时候,由于用的是list集合,而list集合是不具有自动通知前台更新数据的能力。所以,此时,即使list内已经得到了集合数据,但是前台显示的还是空白。明白了吗?
所以,还是乖乖地用ObservableCollection接口比较好!
通过以上的分析,终于明白了问题所在。,对数据绑定,异步加载,等方面的理解也更深了一步。心中的疑惑总算是解决了。好了,时间也不早了,好长时间1点以前没睡过觉了,不过每天能写下自己的学习中的收获,真的很好!如果您也是uwp爱好者,或者有什么疑问,欢迎加入uwp开发交流群:193148992。共同学习交流。