使用Database中的复选框填充StackPanel

时间:2010-03-11 14:41:00

标签: c# .net wpf linq stackpanel

我对WPF很新。我有一个页面,使用L2S显示来自SQL数据库的数据。 L2S返回DataTable,其中包含可供特定区域选择的所有可用选项。它从DataBase返回的每一行都需要checkbox,我想将这些复选框放在stackpanel中。

我是否在寻找StackPanel的数据绑定?这感觉不对......我猜我需要遍历DataTable并为每一行创建复选框项,然后在运行时将它们添加到StackPanel。它是否正确?我的问题返回了DataTable部分吗?

我发现StackPanel有一个DataContext属性,但我不能设置因为它不知道将每个项目设为checkbox,对吗?

2 个答案:

答案 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中的随机位置。每次刷新布局时,项目都会有新的位置。