首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF ContentTemplateSelector不会及时更改ListboxSelectionChanged模板

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

Stack Overflow用户
提问于 2014-05-17 15:39:14
回答 1查看 306关注 0票数 0

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

我的问题是,文本框没有得到关注。有点烦人。

因此,我一直试图为Listbox实现一个附加属性,该属性在设置时将附加一个均衡器到SelectionChanged事件。从那里,我希望钻研,找到文本框,并设置它的重点。

但是,我遇到了一个问题,似乎TemplateSelector还没有选择合适的模板(带有文本框的模板)。实际上,模板是空的。这使我相信它已经删除了TextBlock模板,并将很快选择正确的模板,但只有在整个SelectionChanged事件完成之后。

我的问题是,您知道有一种方法可以强迫这个DataTemplate告诉它是ContentTemplateSelector选择了合适的模板吗?或者,对于当ListboxItem获得焦点时如何在模板中选择这个文本框,有一个不同的想法吗?

下面是如何获得ContentPresenter (来自所选的ListboxItem ):

代码语言:javascript
复制
ContentPresenter cp = FindVisualChild<ContentPresenter>(lbi);

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

不过,cp.ContentTemplate在这一点上是空的。

EN

回答 1

Stack Overflow用户

发布于 2014-05-17 16:32:04

所以我自己想了出来,想贴出我的答案,以防其他人也有类似的问题。

首先,在我的TemplateSelector中,为最后选择的模板添加了一个属性,我可以在代码(称为SelectedTemplate)中获得该属性。

然后,在发生列表框选择更改事件时执行以下操作:

代码语言:javascript
复制
 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;
     }
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23713173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档