原文: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. Android 程序分析环境搭建-动态分析环境搭建

    静态查看过app 的代码,但是有些app 非常复杂,页面好多,你根本找不到从何处下手.还有app 通过静态分析,发现有被加固(后续会讲如何砸壳),根本找不到,还有即便你搜索app界面上的文字,你也搜索 ...

  2. pgwSlideshow.js

    <!DOCTYPE html> <html> <head id="Head"> <meta http-equiv="Conten ...

  3. java编译报错: 找不到或无法加载主类 Demo.class 的解决方法

    原因:java 命令后面的文件不能有后缀名. 解决方法:运行java时候,后面的文件去掉后缀名.

  4. 12C-使用跨平台增量备份减少可移动表空间的停机时间 (Doc ID 2005729.1)

    12C - Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup (Doc ID 20057 ...

  5. Python3 中的Number

    Python3 支持 int.float.bool.complex(复数). 在Python 3里,只有一种整数类型 int,表示为长整型,没有 python2 中的 Long. 像大多数语言一样,数 ...

  6. 从零开始学习java一般需要多长时间?

    从零开始学习java一般需要多长时间? 其实学java一般要多久?因人而异,例如一个零基础的小白自学java,每天学习8个小时来算,而且在有学习资料的基础上,每天学习,从零到找到工作,起码要半年起步, ...

  7. selenium-server-standalone下载网站

    http://selenium-release.storage.googleapis.com/index.html

  8. Ubuntu18.04 下最好用的gif录制工具peek

    最近在写代码,需要找一个ubuntu下的录制屏幕工具,尝试了几个,发现peek是最好用的.这里就给大家推荐一下. 一 安装: 该软件是一个在gihtub上的开源软件,源码路径: https://git ...

  9. Jmeter文件目录介绍

    当我们解压安装包后,在主目录下有以下文件目录,在这里就不一一介绍,主要介绍一些会经常使用到的文件或目录 1.bin目录——存放启动脚本.配置文件.模板等文件 examples:该目录下存放Jmeter ...

  10. 【带着canvas去流浪(10)】文字烟花

    目录 一. 文字烟花 二. 动画原理 2.1 像素操作 2.2 烟花生成算法 2.3 计时器 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址 ...