3

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

我在看数据绑定StackPanel吗?感觉不对...我猜我需要循环DataTable并为每一行创建复选框项目,然后在运行时将它们添加到StackPanel. 这个对吗?退货是DataTable我的问题的一部分吗?

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

4

2 回答 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 属性获取数据。

于 2010-03-11T15:00:32.957 回答
3

除了 Ben Von Handorf 的回答之外,我认为提及您还可以通过更改 ItemsControl 排列其元素的方式来更改ItemsPanel. 例如:

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

这使得 ListBox 水平而不是垂直排列项目。WrapPanel如果您希望项目像文本一样“流动”(或者span如果您知道 html),您也可以使用 a 。WrapPanel 也可以水平或垂直定向。(但尽量不要将 WrapPanel 用于大型项目集合,因为它不是虚拟化的,并且会导致一些很大的延迟。)

您甚至可以创建自己的自定义面板并替换它们。我曾经制作了一个面板,随机布置了它的项目,并将其用于 ListBox。我绑定的集合中的每个项目都显示在 ListBox 内的随机位置。每次刷新布局时,项目都会获得一个新位置。

于 2010-03-11T15:18:26.027 回答