原文:WPF 动态生成对象属性 (dynamic)

项目中列行的数据 都需要动态生成 所以考虑到对象绑定  可需要一个动态生成属性的意思

缺点 加载速度会慢 很明显的慢

解决办法 尽量减轻动态属性的量~

参考文章

https://www.cnblogs.com/maomiyouai/p/3594132.html

https://www.cnblogs.com/dingli/archive/2012/06/14/2548687.html(这个没看明白 但是冥冥中让我觉得 收藏一下以后可能会用)

代码

属性类   想研究明白的 看参考文章


  1. public class NurseScheduleStatisticsModel : DynamicObject
  2. {
  3. Dictionary<string, object> Properties = new Dictionary<string, object>();
  4. public override bool TrySetMember(SetMemberBinder binder, object value)
  5. {
  6. if (!Properties.Keys.Contains(binder.Name))
  7. {
  8. Properties.Add(binder.Name, value.ToString());
  9. }
  10. return true;
  11. }
  12. public override bool TryGetMember(GetMemberBinder binder, out object result)
  13. {
  14. return Properties.TryGetValue(binder.Name, out result);
  15. }
  16. }

生成临时数据


  1. private ObservableCollection<NurseScheduleStatisticsModel> GetNameDataLlist()
  2. {
  3. dynamic model = new NurseScheduleStatisticsModel();
  4. model.Name = "市川 賞子";
  5. model.Class_ = "B";
  6. model.JOb = "リーダー";
  7. model.Num = "1";
  8. model.Num1 = "r1";
  9. model.Num2 = "R1";
  10. model.Num3 = "r1";
  11. model.Num4 = "r1";
  12. model.Num5 = "T1";
  13. dynamic model2 = new NurseScheduleStatisticsModel();
  14. model2.Name = "石田";
  15. model2.Class_ = "B";
  16. model2.JOb = "リーダー";
  17. model2.Num = "2";
  18. model2.Num1 = "r2";
  19. model2.Num2 = "R2";
  20. model2.Num3 = "r3";
  21. model2.Num4 = "r2";
  22. model2.Num5 = "T2";
  23. dynamic model3 = new NurseScheduleStatisticsModel();
  24. model3.Name = "安达 鮎美";
  25. model3.Num = "3";
  26. model3.Class_ = "B";
  27. model3.JOb = "リーダー";
  28. model3.Num1 = "r2";
  29. model3.Num2 = "R3";
  30. model3.Num3 = "r2";
  31. model3.Num4 = "r3";
  32. model3.Num5 = "T3";
  33. modelList.Add(model);
  34. modelList.Add(model2);
  35. modelList.Add(model3);
  36. return modelList;
  37. }

动态增加列和绑定datagrid

dl.Binding = new Binding("Num" + (i + 1) );

这里的bing 绑定的就是对象里的Num1~开始的对象


  1. for (int i = 0; i < 10; i++)
  2. {
  3. DataGridTextColumn dl = new DataGridTextColumn();
  4. dl.Header='num'+i;
  5. dl.Binding = new Binding("Num" + (i + 1) );
  6. dataGrid.Columns.Add(dl);
  7. }
  8. dataGrid.ItemsSource = GetNameDataLlist();

我在项目里 使用一个自定义对象 来包含 dynamic 动态对象 减少不必要的开销

对象


  1. public class NameList : INotifyPropertyChanged
  2. {
  3. public event PropertyChangedEventHandler PropertyChanged;
  4. public NameList(string name, string jOb, string class_, int num, NurseScheduleStatisticsModel model) { Name = name; Class_ = class_; JOb = jOb; Num = num; Ml = model; }
  5. private string name;
  6. public string Name
  7. {
  8. get { return name; }
  9. set
  10. {
  11. name = value;
  12. if (PropertyChanged != null)
  13. {
  14. PropertyChanged(this, new PropertyChangedEventArgs("Name"));
  15. }
  16. }
  17. }
  18. private int num;
  19. public int Num
  20. {
  21. get { return num; }
  22. set
  23. {
  24. num = value;
  25. if (PropertyChanged != null)
  26. {
  27. PropertyChanged(this, new PropertyChangedEventArgs("Num"));
  28. }
  29. }
  30. }
  31. private string class_;
  32. public string Class_
  33. {
  34. get { return class_; }
  35. set
  36. {
  37. class_ = value;
  38. if (PropertyChanged != null)
  39. {
  40. PropertyChanged(this, new PropertyChangedEventArgs("Class_"));
  41. }
  42. }
  43. }
  44. private string jOb;
  45. public string JOb
  46. {
  47. get { return jOb; }
  48. set
  49. {
  50. jOb = value;
  51. if (PropertyChanged != null)
  52. {
  53. PropertyChanged(this, new PropertyChangedEventArgs("JOb"));
  54. }
  55. }
  56. }
  57. private NurseScheduleStatisticsModel ml;
  58. public NurseScheduleStatisticsModel Ml
  59. {
  60. get { return ml; }
  61. set { ml = value;
  62. if (PropertyChanged != null)
  63. {
  64. PropertyChanged(this, new PropertyChangedEventArgs("Ml"));
  65. }
  66. }
  67. }
  68. }

模拟数据


  1. private ObservableCollection<NameList> GetNameDataLlist2()
  2. {
  3. dynamic model = new NurseScheduleStatisticsModel();
  4. model.Num1 = "r1";
  5. model.Num2 = "R1";
  6. model.Num3 = "r1";
  7. model.Num4 = "r1";
  8. model.Num5 = "T1";
  9. dynamic model2 = new NurseScheduleStatisticsModel();
  10. model2.Num1 = "r2";
  11. model2.Num2 = "R2";
  12. model2.Num3 = "r3";
  13. model2.Num4 = "r2";
  14. model2.Num5 = "T2";
  15. dynamic model3 = new NurseScheduleStatisticsModel();
  16. model3.Num1 = "r2";
  17. model3.Num2 = "R3";
  18. model3.Num3 = "r2";
  19. model3.Num4 = "r3";
  20. model3.Num5 = "T3";
  21. //modelList.Add(model);
  22. //modelList.Add(model2);
  23. //modelList.Add(model3);
  24. listName.Add(new NameList("市川 賞子", "リーダー", "B", 1, model));
  25. listName.Add(new NameList("石田", "リーダー", "C", 2, model2));
  26. listName.Add(new NameList("安达 鮎美", "リーダー", "C", 3, model3));
  27. return listName;
  28. }

绑定动态列

需要在套一层Ml对象来引用


  1. for (int i = 0; i < LS.Count; i++)
  2. {
  3. DataGridTextColumn dl = new DataGridTextColumn();
  4. dl.Header=LS[i];
  5. dl.Binding = new Binding("Ml.Num" + (i + 1) );
  6. dataGrid.Columns.Add(dl);
  7. }

就是慢 的有这点数据量就要4秒~6秒 loading加载提示肯定是要有了

希望有人有更好 更成熟的方法

WPF 动态生成对象属性 (dynamic)的更多相关文章

  1. C++ 动态生成对象

    1.啰嗦一下 说起C++,很多人都觉着难学,其实我也是这么觉着的,在这个移动端火到爆的时代,我都想改行了,移动端做东西那都是现有的第三方库,拿来就可以用,而且稳定性好,开发速度快,而且最关键的是出东西 ...

  2. 利用runtime动态生成对象?

    利用runtime我们能够动态生成对象.属性.方法这特性 假定我们要动态生成DYViewController,并为它创建属性propertyName 1)对象名 NSString *class = @ ...

  3. python-根据字符串动态生成对象eval

    # -*- coding: utf-8 -*- stock1={ 'stockName':"沈阳机床", ", 'averagePrice_yesterday':34.0 ...

  4. cglib根据数据动态生成对象

    最近有个任务:根据查询SQL直接导出报表 实现关键是,怎么根据sql查询的数据动态生成对象列表,想到Cglib动态代理实现 废话少说,上代码: 定义动态生成Java Bean类: import jav ...

  5. WPF 动态生成DataGrid及动态绑定解决方案

    一.场景 有过WPF项目经验的朋友可能都知道,如果一个DataGrid要绑定静态的数据是非常的简单的(所谓静态是指绑定的数据源的类型是静态的),如下图所示,想要显示产品数据,只需绑定到一个产品列表即可 ...

  6. 根据xml配置使用反射动态生成对象

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="htt ...

  7. 使用WPF动态生成Code 39条形码

    最近在看些条形码方面相关的资料,而如果只是看的话,效果似乎并不怎么好,所以决定动手做点Demo,以增强对相关知识的记忆. 这里是一个我编写的使用WPF生成Code 39的例子,Code 39的编码很简 ...

  8. vue动态添加对象属性,视图不渲染

    发现数据确实改变了.但是视图没有渲染.原因是赋值的问题,应该这样动态增加属性 vm.$set(vm.template.titleAttachInfoDetail,newKey,newVal) vm 当 ...

  9. Vue动态新增对象属性

    Vue.set( target, key, value ) 参数: {Object | Array} target {string | number} key {any} value 返回值:设置的值 ...

随机推荐

  1. Git实战指南----跟着haibiscuit学Git(第四篇)

    笔名:  haibiscuit 博客园: https://www.cnblogs.com/haibiscuit/ Git地址: https://github.com/haibiscuit?tab=re ...

  2. JS---DOM---part3课程介绍和part2复习

    part3课程介绍   节点 为什么要学节点 节点的操作的相关属性------>作用 12行代码----有用的----熟练的问题, 节点的案例   元素的创建三种方式------重点的内容 为什 ...

  3. vue中计算属性的get与set方法

    计算属性get set方法 在vue的计算属性中,所定义的都是属性,可以直接调用 正常情况下,计算属性中的每一个属性对应的都是一个对象,对象中包括了set方法与get方法 computed:{ ful ...

  4. 使用docker部署filebeat和logstash

    想用filebeat读取项目的日志,然后发送logstash.logstash官网有相关的教程,但是docker部署的教程都太简洁了.自己折腾了半天,踩了不少坑,总算是将logstash和filebe ...

  5. 基于django的个人博客网站建立(七)

    基于django的个人博客网站建立(七) 前言 网站效果可点击这里访问 这次在原来的基础上添加或修改一些小功能 具体内容 1.代码高亮 在原来的blog-details.html页面添加下面的代码: ...

  6. angularjs路由监听,uirouter感知路由变化,解决uirouter路由监听不生效的问题

     壹 ❀ 引 angularjs除了惊为天人的双向数据绑定外,路由也是出彩的一笔,通过路由配置,我们能在不发起页面跳转的情况下,对当前页内容进行整体更新,angularjs提供了ngRoute模块用于 ...

  7. 浅谈Httpmodules

    HttpModule是ASP.NET过滤器,可以理解为HTTP请求的必经之地我们只要实现IHttpModule接口,就可以取代HttpModule namespace BookShop.Handler ...

  8. GO基础之函数的高级用法

    一.可变参数 支持可变长参数列表的函数可以支持任意个传入参数,比如fmt.Println函数就是一个支持可变长参数列表的函数. package main import "fmt" ...

  9. Android 亮度调节功能开发思路整理

    做 Android 音视频播放器开发的时候,我们基本都会遇到一类需求:音量 & 亮度 调节.其中做亮度调节功能的时候,发现还是有一定复杂度的. Android亮度调节分为两个类,分别是: An ...

  10. smobiler自适应不同手机分辨率

    在smobiler中可以通过相对布局或者绝对布局实现自适应不同手机分辨率. 例如实现下图中的布局,图中的布局实际可以分成3个部分,部分1可以使用Title控件,部分2可以使用Panel(在Panel中 ...