|
DataTemplate и неявное преобразование
|
|||
---|---|---|---|
#18+
Сегодня захотел облегчить себе жизнь :) как обычно, но всё оказалось не так просто. Все мы знаем ситуацию, когда надо создать аля CheckBoxList в котором будут перечислены какие то сущности. Так как сама по себе сущность может не предусматривать свойства IsChecked или какой то подобной, не возможно связывать выделение во View с ViewModel, в результате мы не можем понять, выделены или нет эти объекты. Я логично предположил, что было бы удобно создать Generic обёртку для таких ситуаций, которая бы просто добавила мне свойство IsChecked, а работать это должно точно так же как и с Nullable<T>. В результате получился следующий класс: Код: 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.
В классе 2 основных метода, на которые я возлагал свои надежды, это операторы неявного преобразования. Ведь я как наивный дурак предполагал, что DataTemplate будет преобразовывать объект в тот, который указан в свойстве DataType и всё будет прозрачно, точно так же как Nullable<T>. Но не тут то было. Накидав пример Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Код: 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.
я выяснил, что с Nullable всё работает, а с мои классом не работает. В чем грабли? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 15:54 |
|
DataTemplate и неявное преобразование
|
|||
---|---|---|---|
#18+
у меня есть переменная типа Type (указывающая на типа Class1), мне нужно получить объект этого типа, из объекта другого типа (Class2) в котором определен оператор implicit для для преобразования из Class2 в Class1. Как это сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 18:31 |
|
DataTemplate и неявное преобразование
|
|||
---|---|---|---|
#18+
Roman Mejtesу меня есть переменная типа Type (указывающая на типа Class1), мне нужно получить объект этого типа, из объекта другого типа (Class2) в котором определен оператор implicit для для преобразования из Class2 в Class1. Как это сделать? Только через рефлекшен, выдергивая у Class1 public static Class1 op_Implicit(Class2), потому как компилятор при преобразованиях через operator implicit/explicit вставляет в IL-код вызовы именно этих операторов: Код: 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.
Ну, а поскольку биндинг работает через рефлекшн, но, видимо, не ориентируется на наличие операторов преобразования в типе, то и не вызывает эти операторы, а работает всё так же - просто по заданным в разметке свойствам, которых непосредственно у класса-враппера нет. Что же до Nullable<T> - это особый случай, у этого типа поддержка зашита глубоко на уровне CLR, и с ним преобразования работают. В частности, см. Рихтера по нюансы вызова GetType у Nullable<T>: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
- в консольном выводе будет test.Foo. А по поводу "облегчить жизнь" - я бы просто прикрутил IValueConverter, конвертящий из экземпляра враппера в нужный тип. Так действительно будет проще. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2015, 06:33 |
|
DataTemplate и неявное преобразование
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныRoman Mejtesу меня есть переменная типа Type (указывающая на типа Class1), мне нужно получить объект этого типа, из объекта другого типа (Class2) в котором определен оператор implicit для для преобразования из Class2 в Class1. Как это сделать? Только через рефлекшен, выдергивая у Class1 public static Class1 op_Implicit(Class2), потому как компилятор при преобразованиях через operator implicit/explicit вставляет в IL-код вызовы именно этих операторов: Код: 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.
Ну, а поскольку биндинг работает через рефлекшн, но, видимо, не ориентируется на наличие операторов преобразования в типе, то и не вызывает эти операторы, а работает всё так же - просто по заданным в разметке свойствам, которых непосредственно у класса-враппера нет. Что же до Nullable<T> - это особый случай, у этого типа поддержка зашита глубоко на уровне CLR, и с ним преобразования работают. В частности, см. Рихтера по нюансы вызова GetType у Nullable<T>: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
- в консольном выводе будет test.Foo. А по поводу "облегчить жизнь" - я бы просто прикрутил IValueConverter, конвертящий из экземпляра враппера в нужный тип. Так действительно будет проще. Спасибо большое, на счет op_Implicit Уже сам проникся, но отказался от всей этой идеи, запилил просто 2 шаблона и бог с ним, жаль, конечно, по сути получается, что DataType свойство особого смысла не имеет. Как я понял из кода DataTemplate, оно используется только в задании ключа ресурса (как TargetType) и для дизайнера. Иногда WPF раздражающе негибок, особенно касательно Internal классов, свойств и методов. Которые охота переопределить, но возможности такой нет =( надеюсь когда нибудь мы увидим изменения в этом направлении, а то WPF последнее время вообще кое как обновляется. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2015, 12:17 |
|
|
start [/forum/topic.php?fid=21&msg=39025911&tid=1440819]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
148ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
2ms |
others: | 256ms |
total: | 497ms |
0 / 0 |