从数据库加载数据后(让我们说我们加载了课程),我想在列表中显示它们。我已经读过您可以使用UserControl
动态添加内容,但这些示例专门用于动态更改内容,而不是显示结果列表。
我想要的是创建一个 XAML 模板,并为每个列表项实例化一次,并将其添加到列表中(换句话说,将其添加到StackedPanel
)。我怎样才能做到这一点?另外,我应该使用Page
还是UserControl
?
答案 0 :(得分:3)
这正是创建ListBox
和ItemsControl
控件的原因。 ListBox是ItemsControl的增强版本,所以我只讨论后者,基本的。
ItemsControl
包含一个名为ItemsSource
的依赖项属性。在那里传递一个集合,ItemsControl将生成一个"面板"充满了"观点"从该来源获取的物品。
默认情况下,ItemsControl使用StackPanel作为面板,但如果需要,可以通过ItemPanel
属性更改它。
默认情况下,ItemsControl使用默认的WPF模板匹配来生成并显示每个项目的视图。但是,您可以专门使用ItemTemplate
属性设置DataTemplate
来说明视图的外观。
示例:
<!-- simple vertical/StackPanel list -->
<ItemsControl ItemsSource="{Binding MyItems}">
<ItemsControl.ItemTemplate>
<!-- the template of a single Item -->
<!-- note that I'm setting it here explicitely -->
<!-- but the ItemTemplate prop could have been bound, resourcized, etc -->
<DataTemplate>
<Border BorderThickness="1">
<!-- reads a ShoeSize from the items from MyItems -->
<TextBlock Text="{Binding ShoeSize}" />
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<!-- simple horizontal/StackPanel list -->
<ItemsControl ItemsSource="{Binding MyItems}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderThickness="1">
<TextBlock Text="{Binding ShoeSize}" />
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<!-- you can use any panel and any itemtemplate -->
<ItemsControl ItemsSource="{Binding MyXYPoints}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<!-- any Panel is OK! even plain canvas -->
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<!-- just remember that in canvas there's no autolayout -->
<!-- so you need to set the coords on each item! -->
<Ellipse Width="2" Height="2"
Canvas.Left="{Binding PositionX}"
Canvas.Top="{Binding PositionY}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
ListBox
本质上是相同的控件,但为您提供了一些默认的&#39;好东西,如能够滚动(虚拟化)项目,如果有太多,选择一个项目,等等。您可以从ItemsControl获取这些功能,但您需要自己实现或至少配置它们。 ListBox刚刚完成它。但绝对是#34;更重的&#34;比ItemsControl,所以选择最适合的。
无论如何......我写的只是因为我今天心情很好。但是你真的需要阅读更多关于ItemsControl和Bindings的内容。在WPF中,您几乎不会在UI上手动放置代码&#34;。我实际上不应该写这么多,因为专家已经涵盖了所有这些...... 请继续阅读 this excellent series of articles by Dr.Wpf。尤其是&#34; I&#34;章节,因为它与你所询问的内容完全相关,但我真的建议你阅读它们。它们有点详细,对于某些读者来说有点太多了,但它们让你非常需要了解你手头有什么好工具。