You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求可实现DataGrid垂直数据绑定的模型结构方案

实现DataGrid垂直表格的模型设计方案

需求核心是将常规表格的行列互换,让原表头(Title、A、B、C)转换为垂直展示的结构,以下是具体实现方案:

1. 定义基础数据模型

先对应原始数据结构,定义存储横向数据的基础模型:

public class OriginalData
{
    public string Title { get; set; }
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }
}

2. 两种绑定方案选择

方案一:动态生成DataTable(快速适配场景)

适合WinForms/WPF的快速实现,直接生成转置后的DataTable绑定到DataGrid:

public DataTable GetTransposedTable(BindingList<OriginalData> originalData)
{
    DataTable transposedTable = new DataTable();
    
    // 添加原Title作为转置后的表头列
    foreach (var item in originalData)
    {
        transposedTable.Columns.Add(item.Title);
    }
    
    // 原A/B/C列转为转置后的行
    var columnNames = new List<string> { "A", "B", "C" };
    foreach (var colName in columnNames)
    {
        DataRow row = transposedTable.NewRow();
        foreach (var item in originalData)
        {
            row[item.Title] = typeof(OriginalData).GetProperty(colName).GetValue(item);
        }
        transposedTable.Rows.Add(row);
    }
    
    // 新增分类列标注原列名
    transposedTable.Columns.Add("Category", typeof(string));
    for (int i = 0; i < transposedTable.Rows.Count; i++)
    {
        transposedTable.Rows[i]["Category"] = columnNames[i];
    }
    
    return transposedTable;
}

绑定代码:

dataGrid.DataSource = GetTransposedTable(dataCollection);

方案二:强类型模型绑定(MVVM场景适配)

适合WPF的MVVM模式,定义强类型转置模型:

// 转置后的行模型,属性对应原Title的值
public class TransposedRow
{
    public string Category { get; set; } // 对应原A/B/C
    public string Section { get; set; }
    public string LineItem { get; set; }
    public string BrokerCode { get; set; }
    public string BrokerName { get; set; }
}

// 生成转置集合的方法
public ObservableCollection<TransposedRow> GetTransposedCollection(BindingList<OriginalData> originalData)
{
    var transposed = new ObservableCollection<TransposedRow>();
    
    // 处理A列
    transposed.Add(new TransposedRow
    {
        Category = "A",
        Section = originalData.First(x => x.Title == "Section").A,
        LineItem = originalData.First(x => x.Title == "LineItem").A,
        BrokerCode = originalData.First(x => x.Title == "Broker Code").A,
        BrokerName = originalData.First(x => x.Title == "Broker Name").A
    });
    
    // 处理B列
    transposed.Add(new TransposedRow
    {
        Category = "B",
        Section = originalData.First(x => x.Title == "Section").B,
        LineItem = originalData.First(x => x.Title == "LineItem").B,
        BrokerCode = originalData.First(x => x.Title == "Broker Code").B,
        BrokerName = originalData.First(x => x.Title == "Broker Name").B
    });
    
    // 处理C列
    transposed.Add(new TransposedRow
    {
        Category = "C",
        Section = originalData.First(x => x.Title == "Section").C,
        LineItem = originalData.First(x => x.Title == "LineItem").C,
        BrokerCode = originalData.First(x => x.Title == "Broker Code").C,
        BrokerName = originalData.First(x => x.Title == "Broker Name").C
    });
    
    return transposed;
}

在ViewModel中将集合绑定到DataGrid的ItemsSource即可。

3. DataGrid配置示例(WPF)

如果用强类型模型,XAML中可手动指定列:

<DataGrid ItemsSource="{Binding TransposedData}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Category" Binding="{Binding Category}" />
        <DataGridTextColumn Header="Section" Binding="{Binding Section}" />
        <DataGridTextColumn Header="LineItem" Binding="{Binding LineItem}" />
        <DataGridTextColumn Header="Broker Code" Binding="{Binding BrokerCode}" />
        <DataGridTextColumn Header="Broker Name" Binding="{Binding BrokerName}" />
    </DataGrid.Columns>
</DataGrid>

注意事项

  • 若原数据的Title是动态变化的,优先选DataTable方案,强类型模型无法动态添加属性
  • 反射取值若有性能需求,可替换为表达式树或手动映射逻辑

内容的提问来源于stack exchange,提问作者하하파파

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 03:07:05