首先加载网格,然后在每个瓦片上执行异步操作
我有一个小应用程序,我有一个gridview。该网格绑定到一个看起来像这样的源(列表):首先加载网格,然后在每个瓦片上执行异步操作
Person {name;电子邮件;订单;} - 订单是一个IEnumerable。
现在的挑战是我希望网格在没有首先加载订单列表的情况下加载。这是aysnc进入画面的地方。当网格加载并显示人物姓名和电子邮件时,它应该在幕后开始加载每个人的订单。当订单准备就绪时,应该显示它们。
我已经尝试了几种方法:
负载一切与异步,这是一个不错的办法,但电网首次表示将所有源数据准备好。为什么?
加载没有订单列表的人员来源(列表),并尝试在网格显示后为每个人加载订单。我没有做到这一点,因为我似乎无法找到正确的“钩子”,在WebForms中,一个datagrid会有一个“OnItemDataBound”事件,我可以挂钩进去。任何线索?
调度员幕后的东西...复杂和僵化。
它可能是我忽略的控制功能。
任何帮助,非常感谢。无码在这一刻avalible(忘在家里了:))
这是我会怎么做(在Silverlight):
- 制作的异步调用并加载者与每个空的ObservableCollection名单订单... GridView显示数据(名称,电子邮件)。
- 当人员异步调用完成后,再次调用订单,当它返回时,用适当的订单填充每个空订单集合。
如果您使用ObservableCollection,那么订单将显示何时填充每个集合。我假设你有某种钥匙来确定哪些订单与哪个人在一起。
这将是这样的,当订单回来:
For Each p As Person In PersonsList
Dim id = p.PersonId
p.Orders = (From o As Order in OrdersList Where o.PersonId = id).ToList
Next
这是psudo-VB代码,仅仅是一个例子。基本上,关键是使用ObservableCollection来代替通用的IEnumerable,以便集合在你添加或删除某些东西时会更新。
啊,当然......我已经离开了WPF和Silverlight太久了。 INotifyPropertyChanged与你所拥有的指针一起使用了这个技巧。谢谢! – danielovich 2012-02-14 13:06:33
1.有道理。如果你正在加载一切异步,那么它会显示什么时候一切都加载。 2.不知道WPF有这个事件。 3.调度员是正确的工具。调度员有很多选择 - 我不明白你怎么称之为僵化。现在异步是僵化的 - 它只有一个选项。另一种方法是将订单放在一个细节中,并在得到订单之前得到订单(但将它们保存在get中,以便如果再次获取该细节,则将其缓存)。 – Paparazzi 2012-02-13 14:21:34