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;
     }
 }
Другие вопросы по тегам