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