寻求可实现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,提问作者하하파파
相关产品推荐
相关产品推荐

