为什么'this.ContentTemplate.FindName'会在自己的模板上抛出InvalidOperationException?

Mar*_*eIV 15 wpf invalidoperationexception contenttemplateselector

好的...这让我很难过.我在UserControl中覆盖了OnContentTemplateChanged.我正在检查传入newContentTemplate的值实际上是否等于this.ContentTemplate(它确实)当我调用它时...

var textBox = this.ContentTemplate.FindName("EditTextBox", this);
Run Code Online (Sandbox Code Playgroud)

...它抛出以下异常......

"此操作仅对应用此模板的元素有效."

根据另一个相关问题的评论者,他说你应该传入内容主持人来控制,而不是控件本身,所以我试过这个......

var cp = FindVisualChild<ContentPresenter>(this);

var textBox = this.ContentTemplate.FindName("EditTextBox", cp);
Run Code Online (Sandbox Code Playgroud)

其中FindVisualChild只是MSDN示例中使用的辅助函数(见下文),用于查找关联的内容演示者.找到"cp"时,它也会抛出同样的错误.我很难过!

这是辅助函数供参考......

private childItem FindVisualChild<childItem>(DependencyObject obj)
    where childItem : DependencyObject
{
    for(int i = 0 ; i < VisualTreeHelper.GetChildrenCount(obj) ; i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);
        if(child != null && child is childItem)
            return (childItem)child;
        else
        {
            childItem childOfChild = FindVisualChild<childItem>(child);
            if(childOfChild != null)
                return childOfChild;
        }
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

中号

Mik*_*chs 12

在调用FindName方法之前显式应用模板将防止此错误.

this.ApplyTemplate(); 
Run Code Online (Sandbox Code Playgroud)