|
GridSplitter и Binding
|
|||
---|---|---|---|
#18+
Добрый день! Есть такая ситуация. Есть Grid, у него три строки. В первой строке расположены элементы в группе, во второй расположен GridSplitter, в третьей элементы в группе. Плюс высота строки первого грида забиндина на значение enum через конвертер. Для одного значения enum высота ставиться в Auto и элементы в первой строке скрываются. Вторая группа элементов растягивается на полную форму. Для другого значения enum высота ставиться в "*" и элементы первой строки показываются, плюс между элементами групп из первой строки и третьей - сплиттер. Можно ресайзить. Проблема в том, что когда я перемещаю сплиттер для режима отображения двух групп элементов, сплиттер убивает биндинг и ставит в высоту строки какое-то фиксированное, вычисленное значение. А когда я возвращаюсь в режим одной группы элементов без сплиттера, биндинга уже нет на строке грида, элементы скрываются а высота в auto не ставится, а остается фиксом, который выставил сплитер. И вторая группа элементов не растягивается на всю форму. Если сплиттер не трогать, то все работает как нужно. Как сделать так, чтобы сплиттер не убивал биндинг к высоте строки грида? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 12:29 |
|
GridSplitter и Binding
|
|||
---|---|---|---|
#18+
Oleg5555Добрый день! Есть такая ситуация. Есть Grid, у него три строки. В первой строке расположены элементы в группе, во второй расположен GridSplitter, в третьей элементы в группе. Плюс высота строки первого грида забиндина на значение enum через конвертер. Для одного значения enum высота ставиться в Auto и элементы в первой строке скрываются. Вторая группа элементов растягивается на полную форму. Для другого значения enum высота ставиться в "*" и элементы первой строки показываются, плюс между элементами групп из первой строки и третьей - сплиттер. Можно ресайзить. Проблема в том, что когда я перемещаю сплиттер для режима отображения двух групп элементов, сплиттер убивает биндинг и ставит в высоту строки какое-то фиксированное, вычисленное значение. А когда я возвращаюсь в режим одной группы элементов без сплиттера, биндинга уже нет на строке грида, элементы скрываются а высота в auto не ставится, а остается фиксом, который выставил сплитер. И вторая группа элементов не растягивается на всю форму. Если сплиттер не трогать, то все работает как нужно. Как сделать так, чтобы сплиттер не убивал биндинг к высоте строки грида? понять, что вы там наворотили невозможно, покажите XAML код и там уже будем думать, вообще для GridSplitter'а не нужно отдельная строка достаточно разместить его той строке размер которой вы планируйте менять. Но проблему это вашу скорее всего не решит. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 12:49 |
|
GridSplitter и Binding
|
|||
---|---|---|---|
#18+
Вот кусок разметки, отвечающий за интересующую меня вкладку. Кусок достаточно большой. Но интересуют строки грида у которых биндится высота, между ними сплитер. Есть два режима отображения рисков. Интегрированные риски с включенными в каждый дифференцированными (отображаются два грида со сплитером). И список дифференцированных рисков. В этом случае верхний dataGrid скрывается, нижний по своему наполняется и растягивается на всю вкладу, соответственно без сплитера. Если в первом режиме двинуть сплитер, то биндинги со строк grid сбиваются и уже строка с первым dataGrid не получит высоту auto и не сожмется. Код: xml 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. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 13:13 |
|
GridSplitter и Binding
|
|||
---|---|---|---|
#18+
Oleg5555, еще бы на конвертер глянуть gridRowRiskHeightConverter и на перечисление которое вы передает в параметр. а вообще по факту и нормально опишите, какого поведения вы хотите добиться. и как я уже писал GridSlitter не должен находится в собственной строке, он должен быть расположен в той строке, размер которой предполагается изменять. Так же желательно, чтоб размер изменяемый строк был "Star" со звёздочкой, тогда при изменении размера всё должно быть нормально Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Код: c# 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.
вот пример, у меня значения сохраняются через модель представления в Setting'ах, соответствующие параметры типа double есть в настройках проекта. всё отлично работает. Если вы сделайте поле Auto, то из Auto при изменении размера оно превратиться в тип Pixel ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 14:14 |
|
GridSplitter и Binding
|
|||
---|---|---|---|
#18+
Конвертер простой. Просто он возвращает не GridLength. но так все работает. Проблема в другом. Код: c# 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.
Перечисление в качестве параметра это так, дополнительно, я уже пытался что-то придумать. Суть конвертера в том, что он для значения riskMode.IntegrationRisks возвращает высоту "*" (GridUnitType.Star) , а для значения riskMode.DiffRisks - Auto. А если параметр равен GridRowRiskHeightConverterMode.AnlyInfinity, то всегда "*". В какой строке находится сплитер, в данном, случае не принципиально. У меня в отдельной. В режиме когда сплитер отображается, высота соотвествующих строк для масштабирования "*". С этим все нормально. Поведения я хочу следующего. В режиме riskMode.IntegrationRisks отображается два dataGrid. Между ними сплитер. Можно ресайзить. dataGrid-ы в этом случае работают как строка шапки и к ней связанные подстроки. В режиме riskMode.DiffRisks должен отображаться только нижний dataGrid. Он строиться наполняется по своему. Верхний dataGrid и сплитер должны скрываться, а нижний растягиваться на все доступное пространство. Такая логика отрабатывает, если нет сплитера или если его не трогать в первом режиме. Если перетащить сплитер в первом режиме, то бинги со строк grid пропадут и необходима логика отображения не будет работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 15:46 |
|
GridSplitter и Binding
|
|||
---|---|---|---|
#18+
можно попробовать другие походы: создайте контрол, задайте ему шаблон, свойства для DataGrid'ов, в шаблоне в триггерах определите при каком значении поля riskMode Какие строки грида видны, включая сплиттер. Зачем вам для этого биндинг на высоту строк? по сути (как я понял) данная страница имеет 2 состояния, которые зависят от значения RiskMode, вот вы в зависимости от состояния и будете с помощью триггера это менять. не всегда Binding удобен. То есть надо: а) создать контрол и задать все DP которые вы будите передавать из ViewModel в View (типа списков для DataGrid'ов), свойство определяющее состояние (riskMode) б) создать шаблон, в шаблоне задать Grid со сплиттером шапку можно оставить снаружи) в) в гриде разместить ваши DataGrid и забиндить те свойства которые вы передаете (списки и т.д.) г) в <ControlTemplate.Trigger> создать триггер на свойство которое вы определили в пукнте а) определяющее состояние и сеттеры которые будут меня значения для Grid'а. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 16:02 |
|
GridSplitter и Binding
|
|||
---|---|---|---|
#18+
Биндинг на высоту строк нужен для того, чтобы при установке у верхнего блока visibility = Visibility.Collapsed по биндингу высота строки грида установилась в auto и при такой конфигурации строка грида с верхнем скрытым блоком схлопнется до нуля. А нижний блок растянется на все доступное пространство. Видимо нужно искать какие-то другие подходы. Пока еще картина не сложилась. Буду капать дальше. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 16:13 |
|
|
start [/forum/topic.php?fid=21&fpage=16&tid=1440864]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
87ms |
get tp. blocked users: |
1ms |
others: | 253ms |
total: | 428ms |
0 / 0 |