Warum würde 'dies.ContentTemplate.FindName' wirft eine InvalidOperationException auf Ihre eigene Vorlage?
Ok... das hat mich ratlos. Ich habe überschrieben OnContentTemplateChanged in meinem UserControl. Ich bin der überprüfung, ob das übergebene Wert für newContentTemplate in der Tat gleich dies.ContentTemplate (es tut), aber wenn ich rufen Sie diese...
var textBox = this.ContentTemplate.FindName("EditTextBox", this);
...es wirft folgende exception...
"Dieser Vorgang ist gültig nur für Elemente, auf die diese Vorlage angewendet wird."
Pro ein Kommentator in einem anderen Zusammenhang die Frage, er sagte, Sie sollen pass in die Inhalte Moderator für die Steuerung, nicht die Steuerung selbst, so dann habe ich versucht, dieses...
var cp = FindVisualChild<ContentPresenter>(this);
var textBox = this.ContentTemplate.FindName("EditTextBox", cp);
wo FindVisualChild ist nur eine Hilfsfunktion verwendet, die in MSDN-Beispiel (siehe unten), um die damit verbundenen Inhalte und Moderation. Beim 'cp' gefunden wird, zu wirft den gleichen Fehler. Ich bin ratlos!!
Hier ist der helper-Funktion für die Referenz...
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ausdrücklich die Anwendung der Vorlage vor dem Aufruf der
FindName
Methode wird diesem Fehler vorzubeugen.Als John darauf hingewiesen, dass der OnContentTemplateChanged ist gefeuert zu werden, bevor es tatsächlich angewandt, um die zugrunde liegenden ContentPresenter. So müssten Sie unverzüglich Ihren Aufruf FindName, bis es angewendet wird. So etwas wie:
Alternativ können Sie in der Lage sein zu befestigen, einen handler zu LayoutUpdated - Ereignis des UserControl, aber dies kann das Feuer oft mehr, als Sie wollen. Dies würde sich auch mit den Fällen der impliziten DataTemplates obwohl.
Etwas wie dieses:
this.ApplyTemplate()
? Ich finde, dass der alte code zu testen, aber laut den docs, das ist genau das, was es ist es für die, noch sagen Sie, wenn der VisualTree verändert als Ergebnis des Aufrufs.Das ContentTemplate ist nicht angewendet, um den ContentPresenter bis nach diesem Ereignis. Während die ContentTemplate Eigenschaft ist auf die Steuerung an diesem Punkt, es wurde nicht nach unten gedrückt, um Bindungen innerhalb des ControlTemplate, wie der ContentPresenter die ContentTemplate.
Was Sie letztlich versuchen, zu tun, mit dem ContentTemplate? Könnte es ein besseres Gesamtkonzept zu erreichen Sie Ihr Ziel.