|
Обсуждение подходов к установке свойства Visibility в колонках DataGrid-а
|
|||
---|---|---|---|
#18+
Наверное всем приходилось сталкиваться с ситуацией, когда нужно скрывать-показывать колонку в DataGrid-e. Многие знают, что колонка в гриде не является частью визуального дерева, посему не наследует DataContext окна, т.е. напрямую к свойству DataContext-a забиндиться нельзя. Так вот, как скрывать-показывать колонку я могу реализовать тремя способами, вопрос не в этом. Вопрос в том, как эти способы работают "внутри". Просто интересно разобраться. Третий способ (через x:Reference) неинтересный, предлагаю сравнить два. Разметка и код прилагаются. 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.
Code-behind: Код: 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.
Оба подхода очень похожи, оба используют прокси-элемент в качестве ресурса. Разница только в типе. Рассмотрим первый подход через FreezableProxy. Как МНЕ видится как это работает. Создается класс, в классе определяется свойство зависимости (чтоб было куда биндить), потом в это свойство биндится DataContext окна, потом из этого свойства извлекается значение DataContext-a. Вроде все логично, вот только если создавать произвольный класс, а не наследник от Freezable, то работать не будет. Почему - непонятно. Вопрос! Буржуи пишут, что Freezable классы наследуют DataContext и фокус в этом. Вот только в классе Freezable нет свойства DataContext вообще как такового и так или иначе используется руками определенное свойство Data. При чем тут DataContext класса Freezable??? Вопрос! Второй подход через FrameworkElement. Буржуи пишут, что ContentControl наследует DataContext окна (согласен), FrameworkElement, в свою очередь, наследует DataContext у ContentControla (опять согласен). Таким образом, FrameworkElement имеет DataContext окна и потому строка Код: xml 1.
правомерна. Тогда получается, что суть ContentControl-a - передавать транзитом DataContext окна FrameworkElemet-у. У меня возникает логичный вопрос, а почему сразу не написать так Код: xml 1.
пробовал, не работает. Почему? Вопрос! ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2014, 15:51 |
|
Обсуждение подходов к установке свойства Visibility в колонках DataGrid-а
|
|||
---|---|---|---|
#18+
monstrillaпробовал, не работает. Почему? Вопрос!Вопрос из разряда "почему вода мокрая". Ну нужно искать смысл там, где его нет. Да никто и не обещал, что ресурсы будут наследовать DataContext. Можно описать ViewModel в ресурсах и без проблем биндиться к ней напрямую через StaticResource. Код: xml 1. 2. 3. 4. 5.
Если нужен именно DataContext, то можно попробовать ещё такой вариант: Код: xml 1.
DocumentRootExtension ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2014, 17:19 |
|
Обсуждение подходов к установке свойства Visibility в колонках DataGrid-а
|
|||
---|---|---|---|
#18+
Алексей К, нормальный вопрос :) я, кстати, разобрался, точнее мне таки объяснили буржуи авторДа никто и не обещал, что ресурсы будут наследовать DataContext. угу, вот только я был не в курсе. Именно поэтому, ресурс типа Framework элемента нужно где-то размещать в визуальном дереве. ТОгда он понимает, что DataContext нужно наследовать. А Freezable класс хитро реализован и таки наследует DataContext, даже если НЕ является частью визуального дерева (на мсдн, кстати, про это ни слова). Если это принять как данность - вопросы отпадают. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2014, 17:46 |
|
Обсуждение подходов к установке свойства Visibility в колонках DataGrid-а
|
|||
---|---|---|---|
#18+
monstrillaА Freezable класс хитро реализован и таки наследует DataContext, даже если НЕ является частью визуального дерева (на мсдн, кстати, про это ни слова). Если это принять как данность - вопросы отпадают. Тут ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2014, 18:09 |
|
|
start [/forum/topic.php?fid=21&fpage=21&tid=1441058]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
others: | 327ms |
total: | 446ms |
0 / 0 |