WPF网格数据绑定

时间:2009-07-31 19:15:43

标签: wpf xaml binding grid observablecollection

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

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

到目前为止我的想法:

1)在代码隐藏中手动构建网格,并在ObservableCollection更改时重建它。我不喜欢这个,因为它似乎有点笨拙,而不是WPF的做事方式。

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

我认为动态修改网格不是最好的选择。这是另一种解决方案。您可以使用ListBox,但将 ItemsPanel 替换为您选择的其他面板。 ListBox的默认ItemsPanel是VirtualizingStackPanel,其Orientation设置为Vertical。由于您希望项目水平显示,因此可以将VirtualizationStackPanel替换为Orientation设置为水平。当然,您可以根据需要修改ItemsTemplate或其他任何内容。

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

我之前也使用过这个方法来创建一个ListBox,它可以水平显示这些项目,但是当它在线上用尽时,通过使用WrapPanel包裹到下一行。您还可以创建自己的自定义面板并替换它们。我曾经制作了一个面板,随机布置了它的项目,并将其用于ListBox。绑定集合中的每个项目都显示在ListBox中的随机位置。每次刷新布局时,项目都会有新的位置。

答案 2 :(得分:2)

如果您可以接受每行而不是每列中的名称,则应使用带有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>

遗憾的是,在XAML中无法解决方案#2。如果您必须在自己的列中包含每个名称,那么解决方案#1是您最好的选择。