我对WPF很新。我有一个页面,使用L2S
显示来自SQL数据库的数据。 L2S
返回DataTable
,其中包含可供特定区域选择的所有可用选项。它从DataBase返回的每一行都需要checkbox
,我想将这些复选框放在stackpanel
中。
我是否在寻找StackPanel
的数据绑定?这感觉不对......我猜我需要遍历DataTable
并为每一行创建复选框项,然后在运行时将它们添加到StackPanel
。它是否正确?我的问题返回了DataTable
部分吗?
我发现StackPanel
有一个DataContext
属性,但我不能设置因为它不知道将每个项目设为checkbox
,对吗?
答案 0 :(得分:8)
你可能想要一个ItemsControl。这允许您使用指定的DataTemplate呈现一系列项目。你可以在ItemsControl中内联:
<ItemsControl ItemsSource="{Binding MyCollectionOfItems}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding NameOfTheCheckedPropertyOnEachItem}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
或从资源中明确引用数据模板...更像是:
<!-- In some parent resource section -->
<DataTemplate x:Key="MyDataTemplateName">
<CheckBox IsChecked="{Binding NameOfTheCheckedPropertyOnEachItem}"/>
</DataTemplate>
<!-- ... -->
<ItemsControl ItemsSource="{Binding MyCollectionOfItems}" ItemTemplate="{StaticResource MyDataTemplateName}">
</ItemsControl>
或者您可以定义一个DataTemplate,用于定义绑定类的外观。 (请注意,如果你的Linq-to-SQL投射到匿名类型,这不是一个选项),例如:
<!-- In some parent resource section -->
<DataTemplate DataType="{x:Type MyBoundClass}">
<CheckBox IsChecked="{Binding NameOfTheCheckedPropertyOnEachItem}"/>
</DataTemplate>
<!-- ... -->
<ItemsControl ItemsSource="{Binding MyCollectionOfItems}">
</ItemsControl>
然后,WPF将查找与您集合中每个项目的DataType相匹配的DataTemplate。请注意,这对于绑定需要不同演示文稿的异构集合非常有用。
您可以绑定Stackpanel的DataContext,但没有关于为每个数据元素重复模板的固有逻辑。它只是为子控件提供了一个上下文,并包含{Binding ...}
语句。所有处理重复数据的控件都来自ItemsControl,并通过ItemsSource属性获取数据。
答案 1 :(得分:3)
除了Ben Von Handorf的回答之外,我认为你还可以通过更改ItemsPanel
来改变ItemsControl排列元素的方式。例如:
<ListBox ItemsSource="{Binding MyCollection}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
这使得ListBox水平而不是垂直排列项目。如果您希望项目像文本一样“流动”(或WrapPanel
,如果您知道html),也可以使用span
。 WrapPanel也可以水平或垂直定向。 (但是尽量不要将WrapPanel用于大型项目集合,因为它不是虚拟化的,并且会导致一些大的延迟。)
您甚至可以创建自己的自定义面板并替换它们。我曾经制作了一个面板,随机布置了它的项目,并将其用于ListBox。绑定集合中的每个项目都显示在ListBox中的随机位置。每次刷新布局时,项目都会有新的位置。