WPF 网格数据绑定(bind)

标签 wpf xaml binding grid observablecollection

我有一个只有 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/

相关文章:

c# - 为什么 WPF IsKeyboardFocused 提供错误信息?

c# - 如何设计一个 WPF 依赖属性来支持图像路径?

.net - 是什么让 MVVM 特别适合 WPF?

c# - 将样式应用于特定类型的所有子元素

c# - 为什么我的绑定(bind)参数都相同(使用 Linq)?

c# - 在 Canvas WPF c# 中拖动和选择并调整元素大小

windows - 下拉选择控件 - Windows 8 Metro - XAML

c# - 让 FocusManager 等到数据绑定(bind)完成?

cocoa - 界面生成器中的 NSWindowController 对象链接

c# - 如何将控件绑定(bind)到 MVVM 中的 visualbrush?