我有包含DataTemplate
的TextBox
。我将此模板设置为所选内容上的列表框项目。
我无法将焦点设置为模板中的文本框。我试图调用MyTemplate.FindName,但最终导致无效操作异常:此操作仅对应用了此模板的元素有效。
我该如何访问?
最佳答案
由于您知道要关注的TextBox
的名称,因此这变得相对容易。想法是掌握将模板应用于ListBoxItem
本身的方法。
您要做的第一件事是获取选定的项目:
var item = listBox1.ItemContainerGenerator.ContainerFromItem(listBox1.SelectedItem) as ListBoxItem;
然后,您可以将其传递给这个小辅助函数,该函数根据其名称来集中控件:
public void FocusItem(ListBoxItem item, string name)
{
if (!item.IsLoaded)
{
// wait for the item to load so we can find the control to focus
RoutedEventHandler onload = null;
onload = delegate
{
item.Loaded -= onload;
FocusItem(item, name);
};
item.Loaded += onload;
return;
}
try
{
var myTemplate = FindResource("MyTemplateKey") as FrameworkTemplate; // or however you get your template right now
var ctl = myTemplate.FindName(name, item) as FrameworkElement;
ctl.Focus();
}
catch
{
// focus something else if the template/item wasn't found?
}
}
我想棘手的一点是确保您等待该项目加载。我必须添加该代码,因为我是从
ItemContainerGenerator.StatusChanged
事件中调用它的,有时到我们进入该方法时,ListBoxItem
尚未完全初始化。关于wpf - 专注于DataTemplate中的TextBox,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/329556/