【问题标题】:Binding of Multiple DataGrid Column Header绑定多个 DataGrid 列标题
【发布时间】:2015-01-02 21:34:17
【问题描述】:

我在TechNet 看到了这个代码示例,它展示了如何绑定单个列标题标题及其对应的列数据:

<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.Header>
                <TextBlock Text="{Binding DataContext.HeaderNameText, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
            </DataGridTemplateColumn.Header>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding}" />
                    </StackPanel>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>   

DataGrid 的 DataContext 设置如下:

Data data = new Data();
data.HeaderNameText = "Header2";
data.Items = new List<string>() { "Item1", "Item2" };
DataContext = data;

Data类结构如下:

public class Data
{
    public string HeaderNameText { get; set; }
    public List<string> Items { get; set; }
}

我的问题是如何将 DataGrid ItemSource 绑定到多列数据:

List<Data> data=new List<Data>();

我希望为上面列表中的每个数据元素获取一列,那么如何实现呢?

【问题讨论】:

  • 如果您要使用Data 对象列表,那么您还将拥有多个Items,这对我来说毫无意义。拥有一个单独设置值和列标题的对象列表不是更明智吗?
  • 列数是变化因素,不能静态设置(标题也一样)!
  • 您是说同一ItemsSource 中的行之间的列数不同吗?或者仅仅是ItemsSource 中的列数不提前知道?如果是前者,您将不得不在行/记录进入时管理列集。

标签: c# wpf xaml binding wpfdatagrid


【解决方案1】:

给定的方法只定义一列

<DataGrid>
    <DataGrid.Columns>
        <DataGridTemplateColumn ...>
    </DataGrid.Columns>
</DataGrid>

对于多个列,您必须多次定义它

<DataGrid>
    <DataGrid.Columns>
        <DataGridTemplateColumn ...>
        <DataGridTemplateColumn ...>
        <DataGridTemplateColumn ...>
    </DataGrid.Columns>
</DataGrid>

如果你定义这样的列

public class Data
{
    public string[] HeaderNameText { get; set; } // array, list, etc.
    public List<string> Items { get; set; }
}

然后绑定将类似于

{Binding DataContext.HeaderNameText[0] ...}
{Binding DataContext.HeaderNameText[1] ...}

等等

【讨论】:

  • 列数可以改变取决于data.Count(),我不想在xaml中静态定义它们,但我需要定义一个适用于每一列的数据模板!
  • 那么给定的方法将不起作用。您可以使用AutoGenerateColumns = true 并提供列模板(我在这里的某个地方看到过这种方法)或动态生成Columns。两者都需要一些代码。使用搜索,例如here(关键字是wpf datagrid column dynamically)。
猜你喜欢
  • 2011-12-25
  • 1970-01-01
  • 2011-01-12
  • 2023-03-07
  • 2012-02-12
  • 2011-04-13
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
相关资源
最近更新 更多