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)
应用程序显然是"挂起",因为数据加载发生在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)