从数据库中填充StackPanel复选框

3
我对WPF还不是很熟悉。我有一个页面,使用L2S从SQL数据库中显示数据。L2S返回一个DataTable,其中包含特定区域可供选择的所有选项。每个从数据库返回的行都需要是复选框,我想把这些复选框放在StackPanel中。
我应该将数据绑定到StackPanel吗?感觉不对...我猜我需要遍历DataTable并为每一行创建复选框项,然后在运行时将它们添加到StackPanel中。这样做正确吗?返回DataTable是否是我的问题的一部分?
我看到StackPanel有一个DataContext属性,但我不能只设置它,因为它不知道如何将每个项作为复选框处理,对吗?
2个回答

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属性接收它们的数据。

3

除了Ben Von Handorf的回答外,我认为提到您还可以通过更改ItemsPanel来改变ItemsControl排列其元素的方式也是有用的。例如:

<ListBox ItemsSource="{Binding MyCollection}">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

这使得ListBox水平排列项目而不是垂直排列。如果您希望项目像文本一样“流动”(或者如果您知道HTML,则使用),则还可以使用WrapPanel。WrapPanel也可以水平或垂直定向。 (但是尽量不要在大量项目的情况下使用WrapPanel,因为它不是虚拟化的,会导致一些大的延迟。)
您甚至可以创建自己的自定义面板并替换它们。我曾经制作过一个面板,以随机方式布局其项目,并将其用于ListBox。我的绑定集合中的每个项目都在ListBox内的随机位置显示。每次布局刷新时,项目都会获得新位置。

1
非常好的观点...我应该涵盖那个。谢谢你填补我的空缺。 :) - Ben Von Handorf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接