2

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

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

到目前为止我的想法:

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

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

4

3 回答 3

3

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

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

于 2009-08-03T02:19:02.053 回答
3

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

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

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

于 2010-01-31T16:10:55.843 回答
2

如果您可以接受在每一行而不是每列中都有名称,则应该使用带有 GridView View 属性的 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 是您最好的选择。

于 2009-07-31T19:29:52.703 回答