我有包含DataTemplateTextBox。我将此模板设置为所选内容上的列表框项目。

我无法将焦点设置为模板中的文本框。我试图调用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/

10-09 01:55