Hallo,
Ich habe jetzt doch noch ein paar Probleme.
Zuerst einmal muss ich sagen, dass ich doch nicht den Code von Drapondur genommen habe. Ich habe die Templateauswahl über zwei erweiterte DataTemplateSelector-Klassen(Header + Content) geregelt. Das läuft auch sehr gut, solange die Templates schon vor dem Kompilieren im UC als Resource vorliegen. Dann ist auch der Typ bekannt und das macht vieles einfacher.
Ich habe jetzt eine Methode eingebaut, womit man "von außen" Templates in Verbindung mit einem bestimmten Typ hinzufügen kann. Dabei treten zwei Probleme auf:
1) Ich bekomme es hin ein Template zu übergeben, aber nicht einen AddHandler auf einen Button in diesem Template anzuwenden.
Die Methode im UC:
Public Sub AddTemplates(ByVal header As DataTemplate, ByVal content As _
DataTemplate, ByVal newInstanceContent As DataTemplate, ByVal type As _
Type, ByVal btnNewInstanceName As String, ByVal btnDeleteInstanceName _
As String)
'TemplateKeys erstellen
Dim headerTemplateKey As Object = type.Name & "HeaderTemplate"
Dim contentTemplateKey As Object = type.Name & "ContentTemplate"
Dim newInstanceContentTemplateKey As Object = "New" & type.Name & _
"ContentTemplate"
'Type registrieren
AddSupportedType(type)
'Resourcen hinzufügen
Me.Resources.Add(headerTemplateKey, header)
Me.Resources.Add(contentTemplateKey, content)
Me.Resources.Add(newInstanceContentTemplateKey, newInstanceContent)
'AddHandler für Add- und DeleteButton in den Templates
AddHandler TryCast(TryCast(Me.Resources.Item( _
newInstanceContentTemplateKey.ToString), DataTemplate).FindName( _
btnNewInstanceName, Me), Button).Click, AddressOf _
btnCreateNewInstanceGrid_Click
AddHandler TryCast(TryCast(Me.Resources.Item( _
headerTemplateKey.ToString), DataTemplate).FindName( _
btnDeleteInstanceName, Me), Button).Click, AddressOf _
DeleteButton_Click
End Sub Der Aufruf in der Application:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
System.Windows.RoutedEventArgs) Handles Button1.Click
With TabControl1
Dim header, content, newInstanceContent As DataTemplate
Dim headerKey As Object = "StringHeaderTemplate"
header = CType(Me.FindResource(headerKey), DataTemplate)
Dim contentKey As Object = "StringContentTemplate"
content = CType(Me.FindResource(contentKey), DataTemplate)
Dim newInstanceContentKey As Object = "NewStringContentTemplate"
newInstanceContent = CType(Me.FindResource(newInstanceContentKey), _
DataTemplate)
.AddTemplates(header, content, newInstanceContent, GetType(String), _
"btnCreateNewString", "btnDeleteString")
.Source = New String(3) {"Test1", "Test2", "Test3", "Test4"}
End With
End Sub header = ein Label, ein Button
content = ein Label
newInstanceContent = eine Textbox, ein Button
AddSupportedType = übergibt den Type für die Templates an beide DataTemplateSelector
Wie kann ich nun die Buttons finden?
2) Die Sache mit dem Type ist das zweite Problem. Ich habe bisher als Source eine "BindingList(Of Object)"(intern) bzw. eine "IEnumerable(Of Object)"(extern, Property). Ich musste intern die BindingList benutzen, weil sich sonst die TabItems nicht automatisch aktualisiert haben. Außerdem hat jeder TemplateSelector eine List(Of Type), wo alle unterstützten Types aufgelistet sind. Wird dem TemplateSelector dann ein Item übergeben überprüft er, ob sich der Type des Items in der Liste befindet. Wenn das der Fall ist, lädt er das passende Template mit Hilfe einer String-Kombination. Z.B. ist der TemplateKey für den Content für ein String-Objekt "StringContentTemplate", welcher bei "AddTemplates" auch nach diesem Prinzip gesetzt wurde.
Auf jeden Fall ist Object ja keine wirkliche Lösung für den Umgang mit unbekannten Typen. Aber ich habe auch noch nie wirklich mit (Of T) gearbeitet.
Vielleicht kennt jemand eine bessere Lösung.
Das Projekt
Danke im Voraus
Maas
Beitrag wurde zuletzt am 24.05.09 um 13:05:04 editiert. |