我有一个ContentTemplateSelector,可以按预期成功更改。它位于列表框中,其中包含一堆文本块,然后当您在列表框中选择一个项目时,该项目会将其模板更改为具有文本框(因此可以对其进行编辑)。
我遇到的问题是文本框无法获得焦点。这有点烦人。
所以我一直在尝试为Listbox实现一个附加属性,当设置它时,会将一个事件处理程序附加到SelectionChanged事件。从那里,我希望深入挖掘,找到文本框并设置其焦点。
然而,我遇到了障碍,似乎TemplateSelector尚未选择适当的模板(带有文本框的模板)。实际上,Template是NULL。这让我相信它已经删除了TextBlock模板,很快就会选择正确的模板,但只有在整个SelectionChanged事件完成后才会这样。
我的问题是,您是否知道有一种方法可以强制此DataTemplate告诉它的ContentTemplateSelector选择适当的模板,或者可能是一个不同的想法,关于如何在ListboxItem中选择此文本框内的ListboxItem获得关注?
以下是我如何获取ContentPresenter(来自所选的ListboxItem):
ContentPresenter cp = FindVisualChild<ContentPresenter>(lbi);
编辑:我在此之后添加了 cp.ApplyTemplate(),但这并没有改变任何内容。
cp.ContentTemplate 此时为空。
答案 0 :(得分:0)
所以我自己想出来并希望发布我的答案以防其他人遇到类似的问题。
首先,在我的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;
}
}