2011-01-24 35 views
5

Estoy utilizando GetTemplateChild como sigue, pero siempre devuelve NULL. ¿Cómo arreglar esto?GetTemplateChild siempre devuelve nulo

[TemplatePart(Name = "textPoints", Type = typeof(TextBlock))] 
textPoints = (TextBlock)GetTemplateChild("TextBlock"); 
+0

¿Alguna vez encontró una solución para esto? _La respuesta de Reed Copsey_ es correcta para la información que ha proporcionado, pero si esto aún no funciona, quizás podría publicar su plantilla de control ya que puede contener el error. –

+1

En mi experiencia, no es seguro llamar a 'FrameworkElement.GetTemplateChild()' antes de invocar 'FrameworkElement.OnApplyTemplate()'. Pruebe subclasando el control y anulando 'OnApplyTemplate()'. – kevinarpe

Respuesta

4

GetTemplateChild toma el nombrecomo parámetro, no el tipo. Debido a que su XAML se define como:

<TextBlock Text="{Binding}" Foreground="Cyan" 
    x:Name="textPoints" 

Trate de pasar "textPoints" en lugar de "TextBlock" como el nombre para recuperar:

[TemplatePart(Name = "textPoints", Type = typeof(TextBlock))] 
textPoints = (TextBlock)GetTemplateChild("textPoints"); 
+0

Thnaks, probé con el código siguiente, todavía obtengo el mismo resultado (es decir, NULO) textPoints = (TextBlock) GetTemplateChild ("textPoints"); ¿Me estoy perdiendo un poco? – codematrix

+0

No, en el método siguiente, anulación pública anulada OnApplyTemplate(). Otros GetTemplateChilds están trabajando. Tengo un problema solo con este TextBlock. Es parte de . ¿Funcionará GetTemplateChild() en este caso? – codematrix

2

parece que está tratando de obtener niño plantilla de algún otro control, desde donde se están llamando GetTemplateChild?

Si su ItemsControl está dentro de algún UserControl, GetTemplateChild no funcionará ya que los elementos secundarios de su UserControl no forman parte de la plantilla secundaria de ninguna manera y no buscarán de forma recursiva el elemento secundario de cada elemento secundario.

Principalmente GetTemplateChild se utiliza en controles personalizados.

+0

Mira el código anterior, funciona para x: Name = "PointsList" pero no x: Name = "textPoints". ¿Puedes arrojar algo de luz? ¿Funcionará GetTemplateChild() en este caso? – codematrix

+0

No, no funcionará, porque GetTemplateChild solo buscará al niño con nombre en la plantilla actual, su cuadro de texto no está dentro de la plantilla de currny, está dentro de la plantilla de la plantilla secundaria. Tendrá que crear otro control personalizado derivado de ItemsControl; sin embargo, si su control está dentro de la plantilla del elemento, necesitará crear un contenedor de elementos como control personalizado separado. –

+0

El elemento secundario de la plantilla es un tipo de elemento privado para el control actual; solo la plantilla propietaria de los padres puede acceder al elemento secundario de la plantilla; sin embargo, puede navegar por VisualTree y llegar a controles secundarios en cualquier lugar. También ItemsControl tendrá muchos controles con el mismo nombre para cada artículo, entonces, ¿cómo devolverá GetTemplateChild qué elemento? –

Cuestiones relacionadas