[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.运行截图

            

 

posted @   戚戚绛绛  阅读(1147)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示