原文: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. Windows CLI命令

    目录 Windows CLI命令 1.背景 2.netstat 罗列端口号占用情况 3.telnet 远端IP的某个端口号 Windows CLI命令 1.背景 在Windows操作系统下开发,需要用 ...

  2. 利用 uDig 生成 GeoServer 可用的 SLD 渲染文件

    利用 uDig 生成 GeoServer 可用的 SLD 渲染文件 uDig简介 uDig是一个 open source (EPL and BSD) 桌面应用程序框架,构建在Eclipse RCP和G ...

  3. RabbitMQ Win10安装

    RabbitMQ是消息对列,主要是用于做消息代理.本质上说,它接受来自生产者的信息,并将它们传递给消费者.在两者之间,   它可以根据你给它的路由,缓冲规则有选择地进行传递消息.采用Erlang语言开 ...

  4. PHP计算二维数组指定元素的和

    array_sum(array_column($arr, 'num')); //计算二维数组指定元素的和 $arr = [ [ 'id'=>1, 'num'=>3, ], [ 'id'=& ...

  5. windows系统搭建zookeeper

    安装&配置 在apache的官方网站提供了好多镜像下载地址,然后找到对应的版本 下载地址: http://mirrors.cnnic.cn/apache/zookeeper/zookeeper ...

  6. Unity3D VidoePlayer 加载StreamingAssets下视频

    using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;usi ...

  7. HTTP常见响应状态码及解释、常用请求头及解释

    1.HTTP常见响应状态码及解释2XX Success(成功状态码) 200 表示从客户端发来的请求在服务器端被正常处理204 该状态码表示服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主 ...

  8. ReactNative: 使用导航栏组件-NavigatorIOS组件和Navigator组件

    一.简言 在软件开发中,不论是Web还是App,它们的应用程序都是由很多的功能视图组成的.对于这些组合的视图,如何实现页面间平滑地过渡,应用都有统一的一套跳转机制,这个功能就是路由或者叫导航.应用程序 ...

  9. LeetCode 第70题动态规划算法

    导言 看了 动态规划(https://www.cnblogs.com/fivestudy/p/11855853.html)的帖子,觉得写的很好,记录下来. 动态规划问题一直是算法面试当中的重点和难点, ...

  10. PAT 1010 Radix 进制转换+二分法

    Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...