我有一个只有 1 行的网格。我希望由网格的数据上下文确定列的数量。
例如,如果我有一个名为“Names”的 ObservableCollection 属性中公开的名称列表,该属性返回“Fred”、“Joe”和“Anne”,我希望网格中有三列,每列都有一个绑定(bind)到每个的文本框姓名。
到目前为止我的想法:
1) 在代码隐藏中手动构建网格,并在 ObservableCollection 更改时重新构建它。我没有这样做,因为它看起来有点笨拙,而不是 WPF 的做事方式。
2) 使用 Grid 的 ColumnDefinitions 属性创建一个绑定(bind)。这似乎更正确,但 Grid 上没有 ColumnDefinition 的依赖属性。
最佳答案
我不认为动态修改网格是你最好的选择。这是另一个解决方案。您可以使用 ListBox,但替换 项目面板 与您选择的另一个面板。 ListBox 的默认 ItemsPanel 是 VirtualizingStackPanel,Orientation 设置为 Vertical。由于您希望您的项目水平显示,您可以将其替换为 VirtualizingStackPanel 并将 Orientation 设置为 卧式 .当然,您可以修改 ItemsTemplate 或您认为合适的任何其他内容。
<ListBox ItemsSource="{Binding MyCollection}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
我之前也使用此方法创建了一个 ListBox,它水平显示项目,但当它用完行上的空间时,它会通过使用 WrapPanel 换行到下一行。您还可以创建自己的自定义面板并替换它们。我曾经制作了一个面板,随机布置了它的项目,并将其用于 ListBox。我绑定(bind)的集合中的每个项目都显示在 ListBox 内的随机位置。每次刷新布局时,项目都会获得一个新位置。
关于WPF 网格数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1214343/