2010-12-31 4 views
3

Ich habe ein Silverlight UserControl, das das ContentPropertyAttribute verwendet, um die Children-Eigenschaft eines seiner untergeordneten Steuerfelder verfügbar zu machen. Dies ermöglicht es mir geordneten Steuerelemente auf das Panel auf meiner Seite hinzufügen:UserControl untergeordnete Steuerelemente und FindName

<local:MyUserControl> 
    <TextBox Name="tbTest" /> 
</local:MyUserControl> 

Dies funktioniert, abgesehen von dem ‚tbTest‘ Feld der Seite vorhanden ist, aber nicht initialisiert. Bei näherer Betrachtung versucht die InitializeComponent-Methode, die TextBox (mit FindName) zu finden, schlägt dies jedoch fehl (NULL wird zurückgegeben).

Nach einigen Nachforschungen habe ich festgestellt, dass Namescopes das Problem sind - das UserControl hat seinen eigenen Namescope, daher können Kinder nicht mit FindName der Seite gefunden werden, sondern mit der FindName-Methode von UserControl.

Wie kann ich mein UserControl ändern, so dass die untergeordneten Steuerelemente durch die InitializeComponent-Methode lokalisierbar sind? Die Standard-Panels (StackPanel, Grid, etc.) scheinen damit kein Problem zu haben, also muss es eine Lösung geben?

Dank

Antwort

1

Es kann schwierig sein, an dieser Stelle zu tun, aber die beste Vorgehensweise wäre wahrscheinlich die Kontrolle von Items statt Usercontrol abzuleiten. Dann hätten Sie das Problem mit Namensbereichen nicht.

Ich nehme an, als Workaround könnten Sie einen Sprung in das Steuerelement mit VisualTreeHelper tun, um das tbTest-Feld manuell festzulegen.

+0

Ich bin überrascht, dass dies notwendig ist, aber ich werde es versuchen. Was macht die Standard-Panels so besonders, dass sie dieses Problem umgehen? Vielleicht kann ich von einem davon ableiten? – Barguast

+0

Diese Panels haben nichts besonderes, es ist UserControl, das speziell ist. Es ist nicht für die Verwendung als Container-Steuerelement vorgesehen, aber Sie haben eine Möglichkeit gefunden, es mithilfe von ContentPropertyAttribute zum Laufen zu bringen. Sie können sicherlich von Panel ableiten, wenn Ihre Klasse ein Panel ist, aber von dem, was Sie beschrieben haben, scheint ItemsControl besser geeignet zu sein, weshalb ich es vorgeschlagen habe. – Josh