Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF网格数据绑定_Wpf_Xaml_Binding_Grid_Observablecollection - Fatal编程技术网

WPF网格数据绑定

WPF网格数据绑定,wpf,xaml,binding,grid,observablecollection,Wpf,Xaml,Binding,Grid,Observablecollection,我有一个只有一行的网格。我希望列的数量由网格的数据上下文决定 例如,如果我有一个名为'names'的ObservableCollection属性中公开的名称列表,该属性返回“Fred”、“Joe”和“Anne”,我希望网格中有三列,每个列都有一个绑定到每个名称的文本框 到目前为止,我的想法是: 1) 在代码中手工构建网格,并在ObservableCollection发生更改时重新构建它。我没有这样做,因为这似乎有点笨拙,不是WPF的做事方式 2) 使用网格的ColumnDefinitions属性

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

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

到目前为止,我的想法是:

1) 在代码中手工构建网格,并在ObservableCollection发生更改时重新构建它。我没有这样做,因为这似乎有点笨拙,不是WPF的做事方式


2) 使用网格的ColumnDefinitions属性创建绑定。这似乎更正确,但网格中没有ColumnDefinition的dependency属性。

如果您可以接受在每一行而不是每一列中都有名称,那么您应该使用带有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>

不幸的是,解决方案2在XAML中是不可能的。如果必须将每个名称都包含在自己的列中,则解决方案#1是最佳选择。

如果是a,则属性将执行此操作。通过使用,可以将文本框控件而不仅仅是文本放在其中。您需要提供附加到的事件,并在中(您好,Microsoft,这是carpel tunnel calling),使用文本框将列属性设置为模板列


我想说你的可观察收集方式更简单-P.

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

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


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

您想要网格还是数据网格?