【问题标题】:WPF Grid data bindingWPF 网格数据绑定
【发布时间】:2010-11-15 21:45:57
【问题描述】:

我有一个只有 1 行的网格。我希望由网格的数据上下文确定列的数量。

例如,如果我有一个名为“Names”的 ObservableCollection 属性中公开的名称列表,该属性返回“Fred”、“Joe”和“Anne”,我希望网格中有三列,每列都有一个文本框绑定到每个名称。

到目前为止我的想法:

1) 在代码隐藏中手动构建网格,并在 ObservableCollection 更改时重新构建它。我没有这样做,因为它看起来有点笨拙,而不是 WPF 的做事方式。

2) 使用 Grid 的 ColumnDefinitions 属性创建一个绑定。这似乎更正确,但 Grid 上没有 ColumnDefinition 的依赖属性。

【问题讨论】:

  • 你想要 Grid 还是 DataGrid?

标签: wpf xaml binding grid observablecollection


【解决方案1】:

我不认为即时修改网格是您最好的选择。这是另一个解决方案。您可以使用 ListBox,但将 ItemsPanel 替换为您选择的另一个面板。 ListBox 的默认 ItemsPanel 是 VirtualizingStackPanel,Orientation 设置为 Vertical。由于您希望您的项目水平显示,您可以将其替换为 VirtualizingStackPanel,并将方向设置为 Horizo​​ntal。当然,您可以修改 ItemsTemplate 或您认为合适的任何其他内容。

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

我之前也使用此方法创建了一个 ListBox,它可以水平显示项目,但当一行空间不足时,它会使用 WrapPanel 换行到下一行。您还可以创建自己的自定义面板并替换它们。我曾经制作了一个面板,随机布置了它的项目,并将其用于 ListBox。我绑定的集合中的每个项目都显示在 ListBox 内的随机位置。每次刷新布局时,项目都会获得一个新位置。

【讨论】:

    【解决方案2】:

    如果是DataGridAutoGenerateColumns 属性会执行此操作。通过使用DataGridTemplateColumn,您可以在其中放置文本框控件而不仅仅是文本。您需要提供附加到 AutoGeneratingColumn 的事件,并在 AutoGeneratingColumnEventArgs(嗨,Microsoft,这是 carpel 隧道调用)中,将 Column 属性设置为带有文本框的模板列。

    我会说你的 ObservableCollection 方式更简单;-P。

    【讨论】:

      【解决方案3】:

      如果您可以接受在每行而不是每列中使用名称,则应使用具有 GridView 视图属性的 ListView 以及只是一个绑定文本框的自定义 CellTemplate。像这样的:

      <ListView ItemsSource="{Binding Names}">
        <ListView.View>
          <GridView>
            <GridViewColumn>
              <GridViewColumn.CellTemplate>
                <!-- Your textbox goes in a DataTemplate here -->             
              </GridViewColumn.CellTemplate>
            </GridViewColumn>
          </GridView>
        </ListView.View>
      </ListView>
      

      很遗憾,解决方案 #2 在 XAML 中是不可能的。如果您必须在自己的列中包含每个名称,则解决方案 #1 是您的最佳选择。

      【讨论】:

        猜你喜欢
        • 2011-09-28
        • 1970-01-01
        • 1970-01-01
        • 2011-08-15
        • 2012-07-03
        • 2013-11-14
        • 2011-08-14
        相关资源
        最近更新 更多