|
Когнитивный диссонанс
|
|||
---|---|---|---|
#18+
Появилась у меня необходимость сделать ObservableStack<T> класс, в принципе задача рядовая, делается такой класс за пару минут или просто копируется из интернетов. Но проблема не о нём, а о том, с чем я столкнулся в процессе реализации интерфейса INotifyCollectionChanged. Вот такой код я взял для примера: Код: 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.
Код: 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. 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.
что собственно меня смутило. Если вы посмотрите на метод FakePush() из класса ObservableStack, то там реального добавления элемента в стек нет, если только возбуждение события на добавление элемента к коллекции. При этом в самом UI элемент который мы передали в событие появляется. Совершенно не важно добавляем мы в модели представления в коллекцию\стек\что угодно какой то объект или не добавляем. Достаточно просто передать его событии CollectionChanged, что мы добавляем этот элемент. После чего элемент начинает отображаться в ItemsControl, при это виртуализация О_о отлично работает. Если получить View'у этой коллекции, то она содержит все элементы (реальные и "фейковые") при этом имеет собственный список этих элементов, а не просто перечислитель какой то коллекции... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 11:20 |
|
Когнитивный диссонанс
|
|||
---|---|---|---|
#18+
Реальный возвращаемый тип ICollectionView _personsView - это MS.Internal.Data.EnumerableCollectionView из PresentationFramework. Этот класс - прямой наследник CollectionView , и в своем конструкторе передает IEnumerable source (т.е. ваш ObservableStack<T>) в конструктор родителя (CollectionView), где source проверяется на предмет реализации INotifyCollectionChanged, при положительном результате проверки (и еще нескольких) на source навешивается NotifyCollectionChangedEventHandler, в обработчике которого вызывается виртуальный метод CollectionView.ProcessCollectionChanged, переопределенный в EnumerableCollectionView, и в этом переопределенном методе как раз заполняется внутренняя копия source типа ObservableCollection<object> ( см. здесь ). Эта копия (завернутая в ListCollectionView) и служит источником данных для всех методов и свойств реализации ICollectionView. Проверка: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
- с каждым нажатием на кнопку консольный вывод будет инкрементироваться. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 12:33 |
|
|
start [/forum/topic.php?fid=21&fpage=15&tid=1440812]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
48ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 255ms |
total: | 397ms |
0 / 0 |