首先加载网格,然后对每个图块执行异步操作

时间:2012-02-13 14:05:30

标签: wpf silverlight windows-phone-7 windows-8

我有一个小应用程序,我有一个gridview。网格绑定到一个看起来像这样的源(列表):

人{名称;电子邮件;订单;} - 订单是IEnumerable。

现在的挑战是,我希望在不首先加载订单列表的情况下加载网格。这是aysnc即将出现的地方。当网格加载并显示人名和电子邮件时,它应该在幕后开始加载每个人的订单。订单准备好后,应该显示。

我尝试了几种方法:

  1. 使用异步加载所有内容,这是一种正常的方法,但网格首先显示源中的所有数据都准备好了。为什么?

  2. 加载没有订单列表的人员来源(列表),并尝试在网格显示后为每个人加载订单。我没有这样做,因为我似乎无法找到正确的“钩子”,在WebForms中,数据网格会有一个我可以挂钩的“OnItemDataBound”事件。有任何线索吗?

  3. Dispatcher幕后的东西......复杂而僵化。

  4. 这可能是我忽略的控制功能。

    非常感谢任何帮助。此时没有代码可用(在家里忘了:))

1 个答案:

答案 0 :(得分:1)

我就是这样做的(在SILVERLIGHT中):

  1. 进行异步调用并为每个订单加载一个空的ObservableCollection的人员列表... GridView显示数据(名称,电子邮件)。
  2. 当完成人员异步调用时,再次调用订单,当回来时,使用适当的订单填充每个空的Orders集合。
  3. 如果您使用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,以便在您向其添加内容或从中删除内容时更新集合。