WPF - 在Listbox中绑定大量数据

Gee*_*eth 1 data-binding wpf listbox

我正在创建一个书籍搜索页面.数据库中缺少数据.如果数据大小超过2000,则应用程序将被挂起.列表框的ItemsSource有数据但有些错误正在发生.

 <ListBox Grid.Column="1" 
          x:Name="lbResult"  
          ItemsSource="{Binding}"   
          SelectionChanged="lbResult_SelectionChanged">
    <ListBox.ItemTemplate>
         <DataTemplate>
            <StackPanel Width="320">
                <TextBlock Margin="10">
                   <InlineUIContainer>
                       <TextBlock Foreground="DarkKhaki" Text="{Binding Title}"/>
               </InlineUIContainer>
                   <Run Text=" "/><LineBreak/>
                   <InlineUIContainer>
                       <TextBlock Text=" By "/>
               </InlineUIContainer>
                   <Run Text=" "/>
                   <InlineUIContainer>
                       <TextBlock Text="{Binding Author}"/> 
               </InlineUIContainer>
                </TextBlock>
            </StackPanel>
         </DataTemplate>
    </ListBox.ItemTemplate>
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel IsItemsHost="True" Orientation="Vertical"/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>
Run Code Online (Sandbox Code Playgroud)

Chr*_*isF 7

应用程序显然是"挂起",因为数据加载发生在UI线程上.

您应该考虑使用另一种模型,使您能够在另一个线程中加载数据并定期更新UI或在新数据到达时更新UI.

你可以使用一个ObservableCollection.

后台加载线程更新集合,这会向UI线程发出一个事件,指示需要更新.

有一个如何在GALA Soft上执行此操作的示例

您为集合创建属性(在本例中为只读):

private ObservableCollection<MyDataItem> dataItems;
public ObservableCollection<MyDataItem> DataItems
{
      get { return dataItems; }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的XAML中:

<ListBox ItemsSource="{Binding ElementName=mainWindow, Path=DataItems}"
         ...>
</ListBox>
Run Code Online (Sandbox Code Playgroud)