2011-01-24 18 views
5

Sto utilizzando GetTemplateChild come segue, ma restituisce sempre NULL. Come risolvere questo?GetTemplateChild restituisce sempre null

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

Hai mai trovato una soluzione a questo? La risposta di _Reed Copsey_ è corretta per le informazioni fornite, ma se ancora non funziona, forse potresti pubblicare il tuo modello di controllo in quanto potrebbe contenere l'errore. –

+1

In base alla mia esperienza, non è sicuro chiamare 'FrameworkElement.GetTemplateChild()' prima che venga chiamato 'FrameworkElement.OnApplyTemplate()'. Prova a sottoclasse del controllo e sovrascrivi 'OnApplyTemplate()'. – kevinarpe

risposta

4

GetTemplateChild prende il nome come parametro, non è il tipo. Dal momento che il XAML è definito come:

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

Prova a passare "textPoints" anziché "TextBlock" come il nome per recuperare:

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

Thnaks, ho provato con il codice seguente, ottengo ancora lo stesso risultato (cioè NULL) textPoints = (TextBlock) GetTemplateChild ("textPoints"); Mi manca un po '? – codematrix

+0

No, nel metodo seguente, public override void OnApplyTemplate(). Altri GetTemplateChilds stanno funzionando. Ho un problema solo per questo TextBlock. Fa parte di . GetTemplateChild() funzionerà in questo caso? – codematrix

2

Sembra che si sta tentando di ottenere il bambino modello di qualche altro controllo, da dove si stanno chiamando GetTemplateChild?

Se il proprio oggetto ItemsControl si trova all'interno di un controllo utente, GetTemplateChild non funzionerà poiché i figli di UserControl non fanno comunque parte del modello figlio e non eseguiranno ricerche in modo ricorsivo su ogni figlio modello di ogni bambino.

Principalmente GetTemplateChild viene utilizzato nei controlli personalizzati.

+0

Guarda il codice sopra, funziona per x: Name = "PointsList" ma non x: Name = "textPoints". Puoi far luce? GetTemplateChild() funzionerà in questo caso? – codematrix

+0

No, non funzionerà, perché GetTemplateChild cercherà solo child con nome nel modello corrente, la tua casella di testo non è all'interno di curry Template è all'interno del template di template child. Dovrai creare un altro controllo personalizzato derivato da ItemsControl, tuttavia se il tuo controllo è all'interno del modello di articolo allora dovrai anche creare un contenitore di oggetti come controllo personalizzato separato. –

+0

Il modello child è una specie di elemento privato per il controllo corrente, solo il modello proprietario del genitore può accedere al modello child, tuttavia è possibile navigare in VisualTree e raggiungere i controlli figlio ovunque. Anche ItemsControl avrà molti controlli con lo stesso nome per ogni oggetto, quindi in che modo GetTemplateChild restituirà quale elemento? –

Problemi correlati