Почему this.ContentTemplate.FindName выбрасывает исключение InvalidOperationException в своем собственном шаблоне?

Хорошо ... это меня поставило в тупик. Я переопределил OnContentTemplateChanged в своем UserControl. Я проверяю, что значение, переданное для newContentTemplate, фактически совпадает с this.ContentTemplate (оно есть), но когда я вызываю this ...

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

... он генерирует следующее исключение ...

«Эта операция допустима только для элементов, к которым применен этот шаблон».

Согласно комментатору в другом связанном вопросе, он сказал, что вы должны передать ведущего контента для элемент управления, а не сам элемент управления, поэтому я затем попробовал это ...

var cp = FindVisualChild<ContentPresenter>(this);

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

где 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;
}

M

15
задан MarqueIV 15 April 2011 в 16:42
поделиться