[WPF] DataGrid 动态切换数据源 ,动态变化列
因为新项目类似功能界面太多,需要动态变化DataGrid的内容
先感谢两位博主: 山海雍和 https://www.cnblogs.com/maomiyouai/p/3594132.html
可爱的肥皂 https://blog.csdn.net/weixin_42084199/article/details/99701080
部分代码直接搬运的。。。。。。
1. XMAL
1 2 3 4 5 6 7 8 9 10 11 | <Grid> <Grid.RowDefinitions> <RowDefinition Height= "38" /> <RowDefinition/> </Grid.RowDefinitions> <StackPanel Grid.Row= "0" Orientation= "Horizontal" > <Button Click= "Column1_Click" Width= "100" Height= "20" Content= "Column1" x:Name= "Column1" Margin= "8" /> <Button Click= "Column2_Click" Width= "100" Height= "20" Content= "Column2" x:Name= "Column2" Margin= "8" /> </StackPanel> <DataGrid x:Name= "DataGridContent" Grid.Row= "1" AutoGenerateColumns= "False" /> </Grid> |
2. model (最关键的就是这个DynamicObject,组长让我用反射,然后我找到了vs2010的DynamicObject)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public class User:DynamicObject { public string Name { get ; set ; } public string Age { get ; set ; } public string Birth { get ; set ; } public string Remark { get ; set ; } } public class Log : DynamicObject { public string Time { get ; set ; } public string Conetnt { get ; set ; } public string Remark { get ; set ; } } public class DataGridColumnModel { public string TemplateType { get ; set ; } public string Header { get ; set ; } public string Binding { get ; set ; } public string Width { get ; set ; } } |
3.cs 控制数据源切换以及列显示, 两个对象的remark字段都未显示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | public partial class PageDemo: Page { public Dictionary< string , List<DataGridColumnModel>> PageColumnConfig = new Dictionary< string , List<DataGridColumnModel>> { { "Column1" , new List<DataGridColumnModel> { { new DataGridColumnModel { Binding= "Name" , Header= "姓名" , Width= "200" }}, { new DataGridColumnModel { Binding= "Age" , Header= "年纪" , Width= "200" } }, { new DataGridColumnModel { Binding= "Birth" , Header= "生日" , Width= "200" } }, } }, { "Column2" , new List<DataGridColumnModel> { { new DataGridColumnModel { Binding= "Time" , Header= "时间" , Width= "200" }}, { new DataGridColumnModel { Binding= "Conetnt" , Header= "内容" , Width= "200" } } } }, }; public Dictionary< string , List<dynamic>> DataMap = new Dictionary< string , List<dynamic>> { { "Column1" , new List<dynamic>() }, { "Column2" , new List<dynamic>() }, }; public RegisterAnalysis() { InitializeComponent(); for ( int i = 0; i < 10; i++) { dynamic model = new User(); model.Name = "123" ; model.Age = "234" ; model.Birth = "345" ; model.Remark = "345" ; DataMap[ "Column1" ].Add(model); } for ( int i = 0; i < 10; i++) { dynamic model = new Log(); model.Time = "aaaa" ; model.Conetnt = "bbbbb" ; model.Remark = "cccc" ; DataMap[ "Column2" ].Add(model); } ShowColumns( "Column1" ); } public void ShowColumns( string column) { DataGridContent.ItemsSource = DataMap[column]; DataGridContent.Columns.Clear(); var config = PageColumnConfig[column]; foreach ( var item in config) { Binding binding = new Binding(); if (! string .IsNullOrWhiteSpace(item.Binding)) binding.Path = new PropertyPath(item.Binding); if ( string .IsNullOrWhiteSpace(item.TemplateType)) { DataGridTextColumn dataGridTextColumn = new DataGridTextColumn(); dataGridTextColumn.Header = item.Header; dataGridTextColumn.Width = new DataGridLength(Convert.ToDouble(item.Width)); if (! string .IsNullOrWhiteSpace(item.Binding)) dataGridTextColumn.Binding = new Binding(item.Binding); DataGridContent.Columns.Add(dataGridTextColumn); } else { DataGridTemplateColumn dataGridTemplateColumn = new DataGridTemplateColumn(); dataGridTemplateColumn.Header = item.Header; dataGridTemplateColumn.CellTemplate = (DataTemplate)DataGridContent.FindResource(item.TemplateType); DataGridContent.Columns.Add(dataGridTemplateColumn); } } } private void Column1_Click( object sender, RoutedEventArgs e) { ShowColumns( "Column1" ); } private void Column2_Click( object sender, RoutedEventArgs e) { ShowColumns( "Column2" ); } } } |
4.运行截图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现