我有一个ContentTemplateSelector,它正在按预期成功地进行更改。它位于一个列表框中,其中包含一组文本块,然后当您在列表框中选择一个项时,该项目将它的模板更改为有一个textbox (因此可以对其进行编辑)。
我的问题是,文本框没有得到关注。有点烦人。
因此,我一直试图为Listbox实现一个附加属性,该属性在设置时将附加一个均衡器到SelectionChanged事件。从那里,我希望钻研,找到文本框,并设置它的重点。
但是,我遇到了一个问题,似乎TemplateSelector还没有选择合适的模板(带有文本框的模板)。实际上,模板是空的。这使我相信它已经删除了TextBlock模板,并将很快选择正确的模板,但只有在整个SelectionChanged事件完成之后。
我的问题是,您知道有一种方法可以强迫这个DataTemplate告诉它是ContentTemplateSelector选择了合适的模板吗?或者,对于当ListboxItem获得焦点时如何在模板中选择这个文本框,有一个不同的想法吗?
下面是如何获得ContentPresenter (来自所选的ListboxItem ):
ContentPresenter cp = FindVisualChild<ContentPresenter>(lbi);编辑:我在此之后添加了cp.ApplyTemplate(),但这并没有改变任何事情。
不过,cp.ContentTemplate在这一点上是空的。
发布于 2014-05-17 16:32:04
所以我自己想了出来,想贴出我的答案,以防其他人也有类似的问题。
首先,在我的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;
}
}https://stackoverflow.com/questions/23713173
复制相似问题