|
TabControl, ContentTemplate, и DataGrid внутри DataTemplate - как отключить cинхронизацию
|
|||
---|---|---|---|
#18+
Имеется вот такое окошко: Код: 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. 41. 42.
и вот такой XAML: Код: 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.
Проблема в том, что состояние DataGrid синхронизируется между вкладками - меняем размер колонки на одной вкладке, переключаемся на другую - он там тоже изменился. Скрываем колонку у одного грида (чекбоксами под гридом) - колонка скрывается у грида на второй вкладке. Причем если TabControl заменить на любой другой ItemsControl - на ListBox, например, то этой синхронизации не наблюдается. Есть подозрение, что это вызвано тем, что при смене вкладки TabControl делает перегенерацию контента для новой вкладки. Это можно как-то отключить? Если нет, то как вообще можно побороть такое поведение? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2018, 15:23 |
|
TabControl, ContentTemplate, и DataGrid внутри DataTemplate - как отключить cинхронизацию
|
|||
---|---|---|---|
#18+
Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Это связано с тем, как работает ContentPresenter, если в качестве Content выступает UIElement, то в качестве содержимого будет отображаться сам элемент. Но 1 элемент не может отображаться одновременно в 2 ContentPresenter'ах. Если в качестве содержимого (Content) будет выступа не UIElement, а обычный объект или модель представления, то будет использован либо шаблон по умолчанию (TextBlock) или заданный в ContentTemplate или полученный из ContentTemplateSelector. Так как при переключении вкладок переключает содержимое ContentPresenter'а у TabControl и это не UIElement, то на основе шаблона содержимое формируется каждый раз при переключении. Это может вызывать такие проблемы, как у вас, не только дублирование состояния, но и потерю состояния, которые не хранятся в модели представления (фокус и прочие состояния представления). Если количество вкладок не предопределено заранее, то пример выше не выход. Придется доработать элемент управления TabControl, нужно создать ContentControl для каждого TabItem'а, поместить туда содержимое вкладки, задать шаблон и сохранить ссылку на этот объект. При переключении вкладок в качество содержимого должны подставляться ContentControl'ы сохраненные ранее. Так как содержимое сохраненных элементов сформировано, оно не будет перестраиваться. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2018, 15:42 |
|
TabControl, ContentTemplate, и DataGrid внутри DataTemplate - как отключить cинхронизацию
|
|||
---|---|---|---|
#18+
Вот реализация через мультконвертер. Топорная, это пример на коленке, но рабочий. Для работы нужно поменять шаблон TabControl'а. Код: 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.
Код: 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.
модель для примера и роли не играет Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2018, 16:29 |
|
TabControl, ContentTemplate, и DataGrid внутри DataTemplate - как отключить cинхронизацию
|
|||
---|---|---|---|
#18+
Роман, спасибо. Погуглил - оказывается, проблема старая, и тянется чуть ли не с 2007-го года. Ситуация в точности противоположна моему предположению: для сгенерированных TabItems по ContentTemplate TabControl не пересоздает контент, а только меняет data item из ItemsSource, и всё то, что не связано с VM, остается одинаковым для всех вкладок (как вы писали выше). Нашел несколько решений: https://stackoverflow.com/questions/9794151/stop-tabcontrol-from-recreating-its-children https://www.codeproject.com/Articles/460989/WPF-TabControl-Turning-Off-Tab-Virtualization - остановлюсь, наверное, на последнем (оно вполне работает, я проверил). ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2018, 08:30 |
|
TabControl, ContentTemplate, и DataGrid внутри DataTemplate - как отключить cинхронизацию
|
|||
---|---|---|---|
#18+
WinterGraveyardРоман, спасибо. Погуглил - оказывается, проблема старая, и тянется чуть ли не с 2007-го года. Ситуация в точности противоположна моему предположению: для сгенерированных TabItems по ContentTemplate TabControl не пересоздает контент, а только меняет data item из ItemsSource, и всё то, что не связано с VM, остается одинаковым для всех вкладок (как вы писали выше). Нашел несколько решений: https://stackoverflow.com/questions/9794151/stop-tabcontrol-from-recreating-its-children https://www.codeproject.com/Articles/460989/WPF-TabControl-Turning-Off-Tab-Virtualization - остановлюсь, наверное, на последнем (оно вполне работает, я проверил). разберитесь как работает ContentPresenter, что и как он отображает и тогда вопросов таких не будет. подобной "магии" в WPF полно, и когда не знаешь, как это работает, очень тяжко. Магия WPF это палка о двух концах. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2018, 14:16 |
|
|
start [/forum/topic.php?fid=21&tid=1440365]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
167ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 275ms |
0 / 0 |