| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > WPF и Silverlight > Получение доступа к элементу шаблона из кода |
| Автор: ArtemCh 20.3.2010, 22:42 | ||
| Всем доброго времени суток. Недавно начал осваивать WPF и возникла следующая проблема с шаблонами. У меня есть шаблон элемента управления для ListBoxItem-а (Хочу сделать редактируемый ListBox):
Трудность возникает в следующем: как мне из кода OnSelectionChangeSomeList добраться до свойства Text в определённом в шаблоне TextBox-е? |
| Автор: SergeyLoginov 24.3.2010, 17:58 |
| Может попробовать получить экземпляр выделенного ListBoxItem'а (item) и найти TextBox с помощью вызова item.Template.FindName("PART_TextBox", item). Это так... навскидку, сам не проверял. Можно еще порыть в сторону LogicalTreeHelper и VisualTreeHelper |
| Автор: ArtemCh 24.3.2010, 22:32 | ||||
| Спасибо. То что вы предложили пробовал. Пытался даже в отладчике по веткам до TextBox-а добравться, но не получилось... его просто нет в логическом дереве, хотя может не так искал. Вообще я вопрос в более общем виде поставил, мне нужно было просто обновлять источник в привязке при потере фокуса у элемента списка. Так как в шаблоне приходится делать одностороннюю (он не видит если я явно свойство класса укажу). В итоге написал обработчик события и в шаблоне привязал к TextBox-у. Шаблон:
Обработчик:
Это работает, но мне всё же не нравится тем, что если я буду применять шаблон со списком объектов типа SomeClass3, надо дописывать обработчик. Хотелось бы всё таки найти ответ на изначально заданный вопрос. Хотя бы просто узнать в каких случаях возможно добраться из кода до элемента шаблона а в каких нет. |
| Автор: SergeyLoginov 25.3.2010, 17:30 | ||||
Не совсем понял пояснение, почему нельзя использовать двустороннюю привязку и указать UpdateSourceTrigger=LostFocus. Не ясно из контекста кто там кого не видит Насчет поиска дочернего элемента. Я думаю, все же Вы просто не там (не так) ищете. Если TextBox есть в визуальном дереве ListBoxItem'а (а он судя по шаблону там присутствует), то его можно найти в коде. Попробуйте, к примеру, использовать следующий код:
Опять же не отлаживал, данный код - небольшая непроверенная модификация ранее мной написанного. Под Ваши нужды, наверное, имеет смысл его изменить (например, ввести проверку имени, можно уйти от обобщенности). Но это все детали, главное - принцип. Но все же мне кажется, было бы логичней в конкретном случае использовать UpdateSourceTrigger. И насчет "Хотя бы просто узнать в каких случаях возможно добраться из кода до элемента шаблона а в каких нет.". Мне кажется, что в данном случае "кто ищет, тот всегда найдет" ;) |