[WPF] DataGrid 动态切换数据源 ,动态变化列
因为新项目类似功能界面太多,需要动态变化DataGrid的内容
先感谢两位博主: 山海雍和 https://www.cnblogs.com/maomiyouai/p/3594132.html
可爱的肥皂 https://blog.csdn.net/weixin_42084199/article/details/99701080
部分代码直接搬运的。。。。。。
1. XMAL
2. model (最关键的就是这个DynamicObject,组长让我用反射,然后我找到了vs2010的DynamicObject)
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字段都未显示
public partial class PageDemo: Page { public Dictionary> PageColumnConfig = new Dictionary > { {"Column1", new List { { new DataGridColumnModel { Binding="Name", Header="姓名", Width="200"}}, { new DataGridColumnModel { Binding="Age", Header="年纪", Width="200"} }, { new DataGridColumnModel { Binding="Birth", Header="生日", Width="200"} }, } }, {"Column2", new List { { new DataGridColumnModel { Binding="Time", Header="时间", Width="200"}}, { new DataGridColumnModel { Binding="Conetnt", Header="内容", Width="200"} } } }, }; public Dictionary > DataMap = new Dictionary > { { "Column1", new List () }, { "Column2", new List () }, }; 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.运行截图