代码之家  ›  专栏  ›  技术社区  ›  Steve Dunn supercat

WPF网格数据绑定

  •  2
  • Steve Dunn supercat  · 技术社区  · 16 年前

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

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

    到目前为止我的想法是:

    1)手工构建网格,并在ObservableCollection更改时重新构建网格。我没有同意这一点,因为它似乎有点笨拙,而不是WPF的方式做的事情。

    2)使用网格的ColumnDefinitions属性创建绑定。这似乎更正确,但对于ColumnDefinition,网格上没有依赖属性。

    3 回复  |  直到 15 年前
        1
  •  3
  •   Benny Jobigan    15 年前

    我不认为即时修改网格是最好的选择。这是另一个解决方案。您可以使用列表框,但替换 iTimeSpell 选择另一个面板。列表框的默认项是virtualizingstackpanel,方向设置为垂直。因为您希望项目水平显示,所以可以将其替换为方向设置为的virtualizingstackpanel 水平的 . 当然,您可以修改itemstemplate或任何您认为合适的东西。

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

    我以前也用过这个方法来创建一个列表框,它水平地显示项目,但是当项目在行上耗尽空间时,用一个包装板包装到下一行。您还可以创建自己的自定义面板并替换它们。我曾经做过一个面板,它随机地列出了项目,并将其用于列表框。绑定集合中的每个项都在列表框中的随机位置显示。每次刷新布局时,项目都会得到一个新位置。

        2
  •  3
  •   Robert Fraser    16 年前

    如果是 DataGrid , the AutoGenerateColumns 属性可以做到这一点。通过使用 DataGridTemplateColumn ,您可以将文本框控件放置在其中,而不只是文本。您需要提供一个附加到 AutoGeneratingColumn 而在 AutoGeneratingColumnEventArgs (嗨,Microsoft,这是Carpel隧道调用),使用文本框将Column属性设置为模板列。

    我认为你的可观察收集方法更简单;-p.

        3
  •  2
  •   Charlie    16 年前

    如果您可以接受在每一行而不是每一列中使用名称,那么您应该使用ListView和GridView视图属性,以及一个自定义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是您的最佳选择,如果您必须在自己的列中有每个名称。

    推荐文章