sastrian - Mo 16.03.09 18:31
Titel: templates verschachteln
die suche hier im forum ergab nichts was wirklich weitergeholfen hat, daher:
wie kann man mit xaml/wpf templates verschachteln.
es geht konktet um ein quizspielchen, bei dem fragen mit unterschiedlicher anzahl an antworten vorkommen.
ich würde gerne eine template für eine liste von fragen schreiben. die antworten sollen als radiobuttons dargestellt werden (wobei ich für jedes button eine eigene farbe setzen möchte)
ich scheine einige grundlegende dinge des konzeptes von wpf noch nicht verstanden zu haben, da ich seit mehreren stunde verzweifle:
wunsch
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| <ListBox ItemSource="{Binding AlleFragen}"> <ListBox.ItemTemplate> <Textbox... ItemSource="{Binding AlleFragen(i).FrageText}" <GroupBox...ItemSource="{Binding AlleFragen(i)"> <StackPanel> <RadioButton ItemSource="{Binding AlleFragen(i).Antwort(j)}" Background="{Binding AlleFragen(i).Antwort(j).BG_COLOR}" /> </StackPanel> </GroupBox> </ListBox.ItemTemplate> </ListBox> |
mir ist klar, dass dieses beispiel nicht läuft, aber ich hoffe es hilft mein problem zu verstehen.
wie kann man dies lösen?
lg
sas
idealerweise würde ich gerne die templates gar getrennt von einander deklarieren, so dass ich unterschiedliche fragetypen verwalten kann (beispielsweise solche mit buttons und solche mit bilder als antwortmöglichkeiten oder ähnliches)
Kha - Mo 16.03.09 22:17
sastrian hat folgendes geschrieben : |
idealerweise würde ich gerne die templates gar getrennt von einander deklarieren |
Kein Problem in WPF :D . DataTemplate-Ressourcen werden automatisch auf alle Objekte des
DataTypes angewandt, sodass es dann vereinfacht etwa so aussehen könnte:
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| <Window.Resources> <DataTemplate DataType="{x:Type Question}"> <StackPanel> <TextBox Text="{Binding Text}" /> <ItemsControl ItemsSource="{Binding Answers}" /> </StackPanel> </DataTemplate> <DataTemplate DataType="{x:Type Answer}"> <RadioButton Content="{Binding Text}" Background="{Binding BackgroundColor}" /> </DataTemplate> </Window.Resources> ... <ItemsControl ItemsSource="{Binding AllQuestions}" /> |
Das ItemsControl sucht also für jedes Question-Objekt der Quelle das passende Question-Data-Template. In diesem verweist
DataContext dann auf das jeweilige Objekt, wodurch das Binding ermöglicht wird. In diesem Template passiert dann noch einmal das gleiche mit den Answer-Objekten.
Die zwei DataTemplates wissen also nichts voneinander.
Grundsätzlich kann ich bei WPF nur raten, sich ein gutes Buch anzuschaffen. Mein persönlicher Favorit:
http://www.amazon.de/Windows-Presentation-Foundation-Unleashed-Nathan/dp/0672328917