WPF ContentTemplateSelector不会及时更改ListboxSelectionChanged的模板

时间:2014-05-17 15:39:15

标签: c# wpf templates listbox contenttemplateselector

我有一个ContentTemplateSelector,可以按预期成功更改。它位于列表框中,其中包含一堆文本块,然后当您在列表框中选择一个项目时,该项目会将其模板更改为具有文本框(因此可以对其进行编辑)。

我遇到的问题是文本框无法获得焦点。这有点烦人。

所以我一直在尝试为Listbox实现一个附加属性,当设置它时,会将一个事件处理程序附加到SelectionChanged事件。从那里,我希望深入挖掘,找到文本框并设置其焦点。

然而,我遇到了障碍,似乎TemplateSelector尚未选择适当的模板(带有文本框的模板)。实际上,Template是NULL。这让我相信它已经删除了TextBlock模板,很快就会选择正确的模板,但只有在整个SelectionChanged事件完成后才会这样。

我的问题是,您是否知道有一种方法可以强制此DataTemplate告诉它的ContentTemplateSelector选择适当的模板,或者可能是一个不同的想法,关于如何在ListboxItem中选择此文本框内的ListboxItem获得关注?

以下是我如何获取ContentPresenter(来自所选的ListboxItem):

ContentPresenter cp = FindVisualChild<ContentPresenter>(lbi);

编辑:我在此之后添加了 cp.ApplyTemplate(),但这并没有改变任何内容。

cp.ContentTemplate 此时为空。

1 个答案:

答案 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;
     }
 }