【问题标题】:Populate StackPanel with checkbox's from Database使用数据库中的复选框填充 StackPanel
【发布时间】:2010-03-11 14:41:00
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# .net wpf linq stackpanel


    【解决方案1】:

    您可能需要一个 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 属性获取它们的数据。

    【讨论】:

      【解决方案2】:

      除了 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 内的随机位置。每次刷新布局时,项目都会获得一个新位置。

      【讨论】:

      • 好点...我应该已经涵盖了。谢谢你填补我的洞。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-12
      • 2012-06-07
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多