|
Связать DependencyProperty с содержимым UserControl-а
|
|||
---|---|---|---|
#18+
Всем привет! Я хочу создать контрол, где можно выбрать дату с помощью DatePicker-а, а часы и минуты - это 2 комбобокса. И чтобы эта дата-время было свойством зависимости. Код: 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.
Вот xaml.cs файл. Собственно свойство зависимости:SelectedDate и SelectedDatePropertyChangedCallback, который устанавливает выбранные значения для всех контролов. Hours, Minutes - это коллекции источники для комбо-боксов, а Date, Hour, Minute - выбранные элементы. Код: 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.
Собственно вопрос: что нужно сделать, чтобы при изменении часов и минут, (когда пользователь выставляет другое время ) обновлялось значение SelectedDateProperty? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2015, 12:14 |
|
Связать DependencyProperty с содержимым UserControl-а
|
|||
---|---|---|---|
#18+
В общем, решение нашел. Не знаю насколько это правильно. Буду безумно благодарен, если кто-то пнет и скажет как сделать лучше. В общем в каждом свойстве Date, Hour, Minute в сеттере устанавливаю значение SelectedDate + фиксанул SelectedDatePropertyChangedCallback. Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2015, 13:47 |
|
Связать DependencyProperty с содержимым UserControl-а
|
|||
---|---|---|---|
#18+
лично я тоже свой datepicker делал делал след. образом. делал не UserControl, а CustomControl, так как UserControl наследник ContentPresenter'а, для этого контрола мне не нужен контент поле. Идеально подходит класс наследованный от Control. начал с NumberPicker, это миниконтрол который принимает фокус, обрабатывает нажатия только цифровых клавиш, в котором определено максимальное, минимальное значение, количество символов и дальше по вкусу. Переопределяем основные метаданные свойств зависимостей, фокус по умолчанию, стиль по умолчанию и т.д. Задаем поведение, при вводе N символов, передаем фокус на след. элемент. Таким образом при вводе 01022014, ввод будет непрерывным. После смены фокуса ввод осуществляется по новой. Важен контроль значений, 0 можно ввести, но дня 0 не бывает. По этому идеальный вариант будет изменять значение после потери фокуса, а не в момент ввода. Делаем шаблон для этого контрола обычный TextBlock и привязываем его к Value, в последствии я сделал отдельное поле DisplayValue, чтоб была большая гибкость по настройки отображения. Добавляем поведение на нажатие стрелок вверх, вниз (влево\вправо будет работать на FocusManager'е сам) и добавляем прокрутку колёсиком. Затем создал 2 контрол DatePicker , в нем определил поле CurrentDate и отдельные свойства для дня, месяца, года, часа и минут. Сунул их в отдельный класс, там же свойства максимального значения для дня, месяца и года (так как есть еще интервал выбора). Соответственно, если вводить 31.02, то после ввода месяца, значение MaxDay уменьшится до 28(29), а через CourceValue свойства зависимости в 1 контроле, оно преобразится в 28, так же действуем с остальными датами. для Calendar можно просто скопипастить кнопку с шаблона DatePicker'а, либо сделать своё. Прикрутить в шаблон Popup и Calendar'ь в ней. Создавая шаблон важно учитывать, что дата может быть разных форматов в зависимости от локализации. Значит контрол NumberPicker должны располагаться по разному Тут есть 3 пути (на мой взгляд): 1) создаем 3 разновидности шаблона, для разных вариантов типа : DD/MM/YYYY, MM/DD/YYYY и YYYY-MM-DD, создаем свойство зависимости в котором будет определять какой вид отображения имеет дата и в стиле через триггер задает все 3 шаблона. 2) создаем эти объекты динамически через Children, но тогда мы теряем магию WPF, придется зафигачить массу кода, с анимацией будут геморои 3) разместить их в Grid'е и свойство Grid.Column, задать для каждого контрола в параметрах что отображает этот контрол, а конвертер сам всё определит. Определял я через ShortDate из Globalization. как то так делал, получилось довольно удобно для ввода в числах. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2015, 21:13 |
|
Связать DependencyProperty с содержимым UserControl-а
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2015, 04:50 |
|
Связать DependencyProperty с содержимым UserControl-а
|
|||
---|---|---|---|
#18+
Алексей К, проблема в TextBox заключается в том, что ограничения ввода в TextBox невозможно сделать нормальным способом, надо учитывать массу нюансов, обрабатывать множество устройств ввода и т.д. добиться поведения, при котором вводится будет только дата в заданном формате не возможно, а 1 из требования может быть именно это. Не DatePicker, не DateTimePicker такого не позволит. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2015, 10:52 |
|
Связать DependencyProperty с содержимым UserControl-а
|
|||
---|---|---|---|
#18+
Roman Mejtes, Тут, в принципе, не было задачи обеспечить быстрый и безопасный ручной ввод. Даты выбираются на ближайшие дни, поэтому пикер, как мне кажется, удобнее. Хотя дальше будет видно ))) Мне интересно, насколько правильно сделан контрол? Не считая не самый лучший выбор родителя. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2015, 11:47 |
|
Связать DependencyProperty с содержимым UserControl-а
|
|||
---|---|---|---|
#18+
Roman MejtesАлексей К, проблема в TextBox заключается в том, что ограничения ввода в TextBox невозможно сделать нормальным способом, надо учитывать массу нюансов, обрабатывать множество устройств ввода и т.д. добиться поведения, при котором вводится будет только дата в заданном формате не возможно, а 1 из требования может быть именно это. Не DatePicker, не DateTimePicker такого не позволит.Лучше не ограничивать ввод и применить валидацию родных биндингов с соответствующей индикацией. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2015, 13:12 |
|
Связать DependencyProperty с содержимым UserControl-а
|
|||
---|---|---|---|
#18+
Алексей К, это вам как программисту лучше, мне тоже мягко говоря насрать ограничен ввод или нет. Такова и вся "парадигма" ввода и валидации в WPF, вводим, что угодно, а на уровне связывания делаем валидацию и актуализируем её в Validation.Template, но вот у дизайнеров и заказчиков по этому поводу другое мнение может быть и приходится вообще исключаться TextBox из этой схемы, так как он совершенно не подходит в таком случае :( ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2015, 14:15 |
|
Связать DependencyProperty с содержимым UserControl-а
|
|||
---|---|---|---|
#18+
Roman Mejtes... но вот у дизайнеров и заказчиков по этому поводу другое мнение ...И они готовы детально описать плюсы и минусы обоих подходов, чтобы обосновать свой выбор? Мне кажется, что "заказчик всегда прав" не аргумент для технического форума. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2015, 13:46 |
|
|
start [/forum/topic.php?fid=21&fpage=16&tid=1440831]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
57ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
94ms |
get tp. blocked users: |
2ms |
others: | 286ms |
total: | 486ms |
0 / 0 |