Por que 'this.ContentTemplate.FindName' lançaria uma InvalidOperationException em seu próprio modelo?

Ok ... isso me deixou perplexo. Eu substituí OnContentTemplateChanged no meu UserControl. Estou verificando se o valor passado para newContentTemplate é realmente igual a this.ContentTemplate (sim) ainda quando chamo isso ...

var textBox = this.ContentTemplate.FindName("EditTextBox", this);

... lança a seguinte exceção ...

"Esta operação é válida apenas em elementos que têm este modelo aplicado."

Por um comentarista em outra pergunta relacionada, ele disse que você deveria passar o apresentador de conteúdo para o controle, não o controle em si, então tentei isso ...

var cp = FindVisualChild<ContentPresenter>(this);

var textBox = this.ContentTemplate.FindName("EditTextBox", cp);

where FindVisualChild é apenas uma função auxiliar usada no exemplo do MSDN (veja abaixo) para encontrar o apresentador de conteúdo associado. Enquanto 'cp' é encontrado, ele também gera o mesmo erro. Estou perplexo!

Aqui está a função auxiliar para referência ...

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;
}

M

questionAnswers(3)

yourAnswerToTheQuestion