0

我有一个带有四个枢轴的枢轴页面。在两个枢轴中,我有一个 ListBox,我以网格的形式填充信息。我将 ListItems 绑定到一个 ObservableCollection,其中填充了从 WCF 异步获取的信息。

但是,当设置 DataContext 并且 UI 正在用数据填充 ListBox 时,UI 似乎冻结了。ListItems 越多,冻结的时间越长。

编辑:校准。我仍然可以向上/向下滚动页面,但我无法通过滑动导航到不同的枢轴。转换发生在 UI 解冻之后。

有没有办法在不冻结 UI 的情况下填充 ListBox?

编辑:一些示例代码松散地解释了会发生什么。

列表框

<ListBox Name="lbInterruptYesterday" ScrollViewer.VerticalScrollBarVisibility="Disabled"
    ItemsSource="{Binding Interrupts}" 
    ItemTemplate="{StaticResource InterruptListItem}" Tap="Interrupt_OnTap">
</ListBox>

Interrupts 是一个包含 Interrupt 对象的 ObservableCollection。

InterruptListItem 包含一个带有 TextBlocks 的网格,文本绑定到中断对象中的变量。

我通过对 WCF 的异步调用来获取数据。完成后我会:

(sender, e) => Deployment.Current.Dispatcher.BeginInvoke(() =>
    {
        //Some code handling the result which I put in the ObservableCollection
        Production.Interrupts.add(new Interrupt());
        //Set the DataContext    
        DataContext = Production;
    });

并且当设置 DataContext 时,UI 会冻结,直到它被更新。

4

1 回答 1

0

可能是因为ObservableCollection触发了一个事件,导致 UI 更新您添加的每个项目。如果添加大量项目,可能会很耗时。解决方案是创建一个更聪明的 ObservableCollection,您可以在事件触发方面暂停和恢复它。这是一个示例,您可以尝试看看它是否有帮助。

于 2013-02-18T13:30:25.870 回答