WPF ContentTemplateSelector не меняет шаблон вовремя для ListboxSelectionChanged
У меня есть ContentTemplateSelector, который успешно меняется, как и предполагалось. Он находится в списке, который содержит несколько текстовых блоков, затем, когда вы выбираете элемент в списке, этот элемент меняет свой шаблон на текстовое поле (так что его можно редактировать).
У меня проблема в том, что текстовое поле не фокусируется. Что немного раздражает.
Поэтому я пытался реализовать свойство Attached для списка, которое, когда оно установлено, будет прикреплять обработчик событий к событию SelectionChanged. Оттуда я надеюсь развернуть, найти текстовое поле и установить его фокус.
Однако я наткнулся на загадку, когда кажется, что TemplateSelector еще не выбрал соответствующий шаблон (тот, что с текстовым полем). На самом деле шаблон имеет значение NULL. Это приводит меня к мысли, что он уже удалил шаблон TextBlock и скоро выберет правильный шаблон, но только после того, как завершится все это событие SelectionChanged.
У меня вопрос: знаете ли вы, как заставить этот DataTemplate заставить его ContentTemplateSelector выбрать соответствующий шаблон, или, может быть, есть другая идея о том, как я могу выбрать это текстовое поле внутри шаблона, когда ListboxItem получает фокус?
Вот как я могу получить ContentPresenter (из выбранного ListboxItem):
ContentPresenter cp = FindVisualChild<ContentPresenter>(lbi);
РЕДАКТИРОВАТЬ: я добавил cp.ApplyTemplate() после этого, но это ничего не меняет.
cp.ContentTemplate в данный момент не имеет значения.
1 ответ
Так что я понял это сам и хотел опубликовать свой ответ на случай, если у кого-то еще есть подобная проблема.
Во-первых, в моем TemplateSelector добавлено свойство для последнего выбранного шаблона, которое я могу получить в коде (называемом SelectedTemplate).
Затем сделал следующее в случае изменения списка выбора события:
ContentPresenter cp = FindVisualChild<ContentPresenter>(lbi);
var templateSelector = cp.ContentTemplateSelector;
cp.ApplyTemplate();
var template = (templateSelector as DegreeLearningItemTemplateSelector)
.SelectedTemplate;
if (template != null)
{
var textbox = (TextBox)template.FindName("PART_TextBox", cp);
if (textbox != null)
{
FocusManager.SetFocusedElement(lbi, textbox);
textbox.CaretIndex = textbox.Text.Length;
}
}