WPF 动态列(DataGridTemplateColumn) 绑定数据 (自定义控件)对象绑定

时间:2021-06-02 17:50:17

原文:WPF 动态列(DataGridTemplateColumn) 绑定数据 (自定义控件)对象绑定

WPF 动态列(DataGridTemplateColumn) 绑定数据 (自定义控件)对象绑定

WPF 动态列(DataGridTemplateColumn) 绑定数据 (自定义控件)

上面的使用动态对象加载的数据 发现一个问题 一个是卡 二是 对象数量得写死 很不开心

最后使用对象方式 也应该使用对象方式

因为业务需要 我的datagird 数据来源于俩个对象 列头是一个,行和行内容是一个  不好的点是列行的数据匹配 不好掌控 因为业务问题 数据库设计问题 后期再修改成一个对象吧

行对象对象 ColumnsViewModel  里包含 行和行内容

Ml是行内容集合 与列对应


  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.ComponentModel;
  5. using System.Linq;
  6. using System.Text;
  7. namespace HDG_COMPLEX_INPUT.ViewMode
  8. {
  9. public class DataRowViewModel : INotifyPropertyChanged
  10. {
  11. public event PropertyChangedEventHandler PropertyChanged;
  12. public DataRowViewModel() { }
  13. //public DataRowViewModel(string name, string jOb, string class_, int num, List<DataViewModel> model, string spID) { Name = name; Class_ = class_; JOb = jOb; Num = num; Ml = model; STEPID = spID; }
  14. private string sTAFFID;
  15. public string STAFFID
  16. {
  17. get { return sTAFFID; }
  18. set
  19. {
  20. sTAFFID = value;
  21. if (PropertyChanged != null)
  22. {
  23. PropertyChanged(this, new PropertyChangedEventArgs("STAFFID"));
  24. }
  25. }
  26. }
  27. private string name;
  28. public string Name
  29. {
  30. get { return name; }
  31. set
  32. {
  33. name = value;
  34. if (PropertyChanged != null)
  35. {
  36. PropertyChanged(this, new PropertyChangedEventArgs("Name"));
  37. }
  38. }
  39. }
  40. private int num;
  41. public int Num
  42. {
  43. get { return num; }
  44. set
  45. {
  46. num = value;
  47. if (PropertyChanged != null)
  48. {
  49. PropertyChanged(this, new PropertyChangedEventArgs("Num"));
  50. }
  51. }
  52. }
  53. private string class_;
  54. public string Class_
  55. {
  56. get { return class_; }
  57. set
  58. {
  59. class_ = value;
  60. if (PropertyChanged != null)
  61. {
  62. PropertyChanged(this, new PropertyChangedEventArgs("Class_"));
  63. }
  64. }
  65. }
  66. private string jOb;
  67. public string JOb
  68. {
  69. get { return jOb; }
  70. set
  71. {
  72. jOb = value;
  73. if (PropertyChanged != null)
  74. {
  75. PropertyChanged(this, new PropertyChangedEventArgs("JOb"));
  76. }
  77. }
  78. }
  79. private List<DataViewModel> ml;
  80. public List<DataViewModel> Ml
  81. {
  82. get { return ml; }
  83. set
  84. {
  85. ml = value;
  86. if (PropertyChanged != null)
  87. {
  88. PropertyChanged(this, new PropertyChangedEventArgs("Ml"));
  89. }
  90. }
  91. }
  92. }
  93. public class DataViewModel : INotifyPropertyChanged
  94. {
  95. public event PropertyChangedEventHandler PropertyChanged;
  96. /// <summary>
  97. /// 颜色
  98. /// </summary>
  99. private string rPG;
  100. public string RPG
  101. {
  102. get { return rPG; }
  103. set { rPG = value;
  104. if (PropertyChanged != null)
  105. {
  106. PropertyChanged(this, new PropertyChangedEventArgs("RPG"));
  107. }
  108. }
  109. }
  110. /// <summary>
  111. /// 秒数
  112. /// </summary>
  113. private string second;
  114. public string Second
  115. {
  116. get { return second; }
  117. set { second = value;
  118. if (PropertyChanged != null)
  119. {
  120. PropertyChanged(this, new PropertyChangedEventArgs("Second"));
  121. }
  122. }
  123. }
  124. /// <summary>
  125. /// 个数
  126. /// </summary>
  127. private int cOUNT;
  128. public int COUNT
  129. {
  130. get { return cOUNT; }
  131. set { cOUNT = value; }
  132. }
  133. /// <summary>
  134. /// 子项目名
  135. /// </summary>
  136. private string sTEPNAME;
  137. public string STEPNAME
  138. {
  139. get { return sTEPNAME; }
  140. set { sTEPNAME = value; }
  141. }
  142. //标准秒数
  143. private string sSecond;
  144. public string SSecond
  145. {
  146. get { return sSecond; }
  147. set
  148. {
  149. sSecond = value;
  150. if (PropertyChanged != null)
  151. {
  152. PropertyChanged(this, new PropertyChangedEventArgs("SSecond"));
  153. }
  154. }
  155. }
  156. }
  157. }

DATAgrid 绑定 行集合

先绑定Ml对象  在自定义控件内定义依赖属性 接受 在拆解对象


  1. /// <summary>
  2. /// 生成DataGrid 列
  3. /// </summary>
  4. void addColumn()
  5. {
  6. dataGrid.Columns.Clear();
  7. for (int i = 0; i < ListColumn.Count; i++)
  8. {
  9. //生成 列
  10. DataGridTemplateColumn dl = new DataGridTemplateColumn();
  11. //获得列头信息 格式 : 上下カップ押え_62s_B_4
  12. ColumnsViewModel model = ListColumn[i];
  13. dl.Header = model.Clm;
  14. //数据绑定
  15. Binding binding = new Binding()
  16. {
  17. Path = new PropertyPath("Ml["+i+"]")// 需绑定的数据源属性名
  18. ,
  19. Mode = BindingMode.OneWay// 绑定模式
  20. ,
  21. UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
  22. };
  23. //生成数据模板
  24. DataTemplate MyDataTemplate = new DataTemplate();
  25. //生成自定义控件
  26. var Item = new FrameworkElementFactory(typeof(ItemControl));
  27. Item.SetBinding(ItemControl.SetRGBProperty, binding); //数据绑定
  28. MyDataTemplate.VisualTree = Item;//注册可视树
  29. dl.CellTemplate = MyDataTemplate;//单元格模板注册
  30. dataGrid.Columns.Add(dl);
  31. }
  32. }

一定会有更好的办法  这个程序设计上是有问题的 数据太复杂   时间还少

开发也没时间思考  所以 很多人不愿意维护别人的代码

有好的设计模式 就给更新掉