|
Custom DataGridBoundColumn+Virtualizing: неправильная работа биндинга
|
|||
---|---|---|---|
#18+
Ситуация: имеется DataGrid с кастомной колонкой, унаследованной от DataGridBoundColumn (здесь и ниже код максимально упрощен для приведения в качестве примера): Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Заполнение данных: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Разметка: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
В результате в той части окна, которая видна непосредственно в скроллере грида, данные отображаются корректно, если начать скроллить, то данные в сustom DataGridBoundColumn отображаются в странном порядке - практически в произвольном (см. скриншот ниже). Порылся в гугле - нашел, что один человек уже сталкивался с таким: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/08fa78c6-5d25-434d-b00d-19380e84a31e/ - ему предложили отключить виртуализацию грида (VirtualizingStackPanel.IsVirtualizing = False). В моем случае это совсем не вариант, т.к. данных в гриде предполагается достаточно много, и отключение виртуализации даже в приведенном тестовом примере вызывает заметные тормоза при загрузке данных модели. Что еще можно предпринять в этом случае? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2013, 14:57 |
|
Custom DataGridBoundColumn+Virtualizing: неправильная работа биндинга
|
|||
---|---|---|---|
#18+
P.S. WPF 4.0, MSVS 2010 Prof, WinXP SP3 Prof. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2013, 15:05 |
|
Custom DataGridBoundColumn+Virtualizing: неправильная работа биндинга
|
|||
---|---|---|---|
#18+
BindingHorrorПотому что забиндено на dataItem. При дефолтном в гриде режиме виртуализации он меняется из-за повторного использования контейнеров элементов (DataGridRow). Надо биндиться на DataContext TextBlock-а. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2013, 15:27 |
|
Custom DataGridBoundColumn+Virtualizing: неправильная работа биндинга
|
|||
---|---|---|---|
#18+
Вроде как надо просто убрать Source = dataItem в описании биндинга. По дефолту будет привязка к DataContext. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2013, 15:28 |
|
Custom DataGridBoundColumn+Virtualizing: неправильная работа биндинга
|
|||
---|---|---|---|
#18+
Алексей К, Точно, так оно и есть - убрал Source = dataItem, и все заработало, как надо. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2013, 15:40 |
|
Custom DataGridBoundColumn+Virtualizing: неправильная работа биндинга
|
|||
---|---|---|---|
#18+
Дабы не создавать новой темы, спрошу тут, надеюсь автор будет не против. WPF 4.5. Есть DataGrid VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.VirtualizationMode="Recycling", хочу сделать CurrentCell индикатор на DataGridRowHeader'e, создал соответствующее attachedproperty, при смене CurrentCell, получаю этот DataGridCell и устанавливаю IsCurrentCell (attachedproperty), в Template DataGridRowHeader добавил Path (тот самый индикатор) visibility биндю к этому самому attachedproperty. Все работает отлично без виртуализации, но с виртуализацией этот индикатор сползает при вертикальном скроллинге, понятно почему так происходит, но как правильно сделать подобный бинд не соображу. И еще, возможно ли сделать при ScrollViewer.IsDeferredScrollingEnabled="True" DeferredScroll только по вертикали? Можно в эвенте смотреть как скролится и менять IsDeferredScrollingEnabled, если, конечно, по другому нельзя. Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2013, 23:41 |
|
Custom DataGridBoundColumn+Virtualizing: неправильная работа биндинга
|
|||
---|---|---|---|
#18+
JackTheReaper, Зачем этот огород с attached property, когда у DataGridRowHeader уже есть а) свойство IsRowSelected ; б) visual states Normal_CurrentRow / Normal_CurrentRow_Selected / Unfocused_CurrentRow_Selected (см. здесь )? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2013, 06:26 |
|
Custom DataGridBoundColumn+Virtualizing: неправильная работа биндинга
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныJackTheReaper, Зачем этот огород с attached property, когда у DataGridRowHeader уже есть а) свойство IsRowSelected ; б) visual states Normal_CurrentRow / Normal_CurrentRow_Selected / Unfocused_CurrentRow_Selected (см. здесь )? а) Не подходит, так как может быть несколько выбранных строк и для каждой будет видим индикатор б) как с этим работать? Как сделать биндинг, например к Normal_CurrentRow_Selected? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 21:28 |
|
Custom DataGridBoundColumn+Virtualizing: неправильная работа биндинга
|
|||
---|---|---|---|
#18+
JackTheReaperКак сделать биндинг, например к Normal_CurrentRow_Selected? Никак. Откройте для себя VisualStateManager и стили на основе visual states . ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2013, 06:29 |
|
Custom DataGridBoundColumn+Virtualizing: неправильная работа биндинга
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныJackTheReaperКак сделать биндинг, например к Normal_CurrentRow_Selected? Никак. Откройте для себя VisualStateManager и стили на основе visual states . Большое спасибо за VisualState, очень полезно. Вот решение на основании VisualState: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Единственно что не удобно, так это необходимость указывать все состояния в которых может находиться текущая строка и когда DataGrid теряет фокус, пропадает PathCurrent. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2013, 00:27 |
|
|
start [/forum/topic.php?fid=21&msg=38270887&tid=1441386]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
153ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 263ms |
0 / 0 |