PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Template Problem in XAML/Silverlight


anakin87
2013-04-22, 09:42:43
Hallo liebe Coder,

ich hab da ein kleines Problem mit XAML & Silverlight...
Beim Bugfixing ist mir ein Template ins Auge gesprungen, dass wie eine verkettete Liste aussiet. Problem dabei ist, dass ich n Datensätze habe die als Baum angezeigt werden sollten.
Es sind 3 Templates definiert und beim 4. Level erscheinen keine Templates mehr sondern nur der Text vom Datentyp.


Ok das hört sich jetzt komisch an... ich zeig mal etwas vom Code her:


<Windows:HierarchicalDataTemplate x:Key="Level1ItemTemplate"
ItemsSource="{Binding Edges}"
ItemTemplate="{StaticResource Level2ItemTemplate}"> <!--Zeigt auf das 2. Template und das dann wieder aufs 3.-->
<Grid MinHeight="50"
MinWidth="50"
Margin="5">
<Border Padding="5"
BorderThickness="1"
BorderBrush="#FFADADAD"
CornerRadius="5">
<Border.Background>
<LinearGradientBrush EndPoint="0.5,1"
StartPoint="0.5,0">
<GradientStop Color="GreenYellow"
Offset="0" />
<GradientStop Color="Green"
Offset="1" />
</LinearGradientBrush>
</Border.Background>
<RV:NodeVisualization /> <!--Zeigt auf 2. xaml für den Inhalt des Templates-->
</Border>
</Grid>
</Windows:HierarchicalDataTemplate>

<Windows:HierarchicalDataTemplate x:Key="Level2ItemTemplate"
ItemsSource="{Binding Edges}"
ItemTemplate="{StaticResource MainItemTemplate}">
<Grid MinHeight="50"
MinWidth="50"
Margin="5">
<Border Padding="5"
BorderThickness="1"
BorderBrush="#FFADADAD"
CornerRadius="5">
<Border.Background>
<LinearGradientBrush EndPoint="0.5,1"
StartPoint="0.5,0">
<GradientStop Color="#FFD47E00"
Offset="0" />
<GradientStop Color="#FF563300"
Offset="1" />
</LinearGradientBrush>
</Border.Background>
<RV:NodeVisualization />
</Border>
</Grid>
</Windows:HierarchicalDataTemplate>

<DataTemplate x:Key="MainItemTemplate">
<Grid MinHeight="50"
MinWidth="50"
Margin="5">
<Border Padding="5"
BorderThickness="1"
BorderBrush="DarkGoldenrod"
CornerRadius="5">
<Border.Background>
<LinearGradientBrush EndPoint="0.5,1"
StartPoint="0.5,0">
<GradientStop Color="Yellow" />
<GradientStop Color="Red"
Offset="1" />
</LinearGradientBrush>
</Border.Background>
<RV:NodeVisualization />
</Border>
</Grid>
</DataTemplate>




Wie kann ich wenn ich beim MainItemTemplate bin wieder auf Level1ItemTemplate springen?? Ich kann nicht glauben dass ich für n - Datensätze auch n Templates "HÄNDISCH" definieren muss, oder doch??
:confused:

Bin für jeden Tipp dankbar... THX
Beste Grüße

PatkIllA
2013-04-22, 19:54:05
Mit welchem Control werden die Templates denn benutzt?
Macht das RV:NodeVisualization noch irgendetwas hierachrisches?
Ich wundere mich gerade, dass überhaupt eine vierte Ebene angezeigt wird, denn du hast ja nur auf zwei Ebenen HierarchicalDataTemplates. Auf der dritten kommt dann das normale DataTemplate (MainTemplate) ohne Verschachtelung.

Sind in der Datenstruktur immer die gleichen Klassen? Die Unterelemente kommen ja jedesmal aus der Property Edges.
DataTemplateSelector scheint es ja in Silverlight nicht zu geben.

Ich kann nicht glauben dass ich für n - Datensätze auch n Templates "HÄNDISCH" definieren muss,
Du meinst n Ebenen oder? Das kann schon passieren, wenn die unterschiedlich aussehen sollen.
Üblicher ist ja, dass man das aussehen für bestimmte Objekttypen definieren will. Unabhängig davon auf welche Tiefe die auftauchen.

anakin87
2013-04-23, 09:12:00
Mit welchem Control werden die Templates denn benutzt?
Anscheinend wird das über einen ItemContainer als Canvas geregelt
ItemContainer.Children.Add(Item) - für Root-Item
Im XAML ist alles in einem <UserControl.Resources> drinnen.
die Children werden warum auch immer anders hinzugefügt - k.a. warum und wie das muss ich noch aufarbeiten. Anscheinend wird dabei noch eine Abstraktionsebene eingezogen...


Macht das RV:NodeVisualization noch irgendetwas hierachrisches?
Nein beinhaltet nur eine Listbox um mehrere Items aufzunehmen / pro Node


Ich wundere mich gerade, dass überhaupt eine vierte Ebene angezeigt wird, denn du hast ja nur auf zwei Ebenen HierarchicalDataTemplates. Auf der dritten kommt dann das normale DataTemplate (MainTemplate) ohne Verschachtelung.
Ja ein Template wird nicht angezeit aber Text in der Form des Klassnenamen des Items. Ich würde selber gerne wissen wie das nicht hierarchische da dazukommt...
Ich vermute dass das ItemTemplate="{StaticResource MainItemTemplate}" etwas damit zu tun hat - für mich sieht es wie eine Verkettung aus...
Level 1 in den richtigen Farben (root)
Level 2 in den richtigen Farben
Level 3 in den richtigen Farben (als nicht hierarchisches Template, laut den Farben wird das verwendet <DataTemplate x:Key="MainItemTemplate">)
Level 4 kein Template nur Text in der Form "Projektname.Ordner.Klasse"


Sind in der Datenstruktur immer die gleichen Klassen? Die Unterelemente kommen ja jedesmal aus der Property Edges.
DataTemplateSelector scheint es ja in Silverlight nicht zu geben.

Jein selbe Ableitung, Unterschiede werden eigens in einem Detailfenster angezeit


Du meinst n Ebenen oder? Das kann schon passieren, wenn die unterschiedlich aussehen sollen.
Üblicher ist ja, dass man das aussehen für bestimmte Objekttypen definieren will. Unabhängig davon auf welche Tiefe die auftauchen.
Ja ok das ist mir klar dass ich unterschiedliche selbst definieren muss.

Wichtig wäre für mich, wie kann ich bei Level2 wieder anfangen wenn ich bei Level 3 angekommen bin -> eine Referenz mit ItemTemplate="{StaticResource Level2ItemTemplate}" im <DataTemplate></DataTemplate> erkennt das Programm nicht... Die anderen 2 verketten sich doch auch auf die selbe Art und Weise.
Oder was auch geht ist das nur das Root-Item eine andere Farbe hat alle anderen Ebenen können gleich sein. (vorerst)

EDIT: womit ich zur Zeit am gröbsten kämpfen muss ist, dass ich nicht verstehe wie das Programm unterscheidet in welcher Ebene es sich befindet. Auch im .cs hab ich nichts gefunden, dass explizit die verschiedenen Templates verwendet. Ich vermute, dass es anhand des Parent-Item in die nächste hirarische Tiefe geht und das selbst entscheidet. Nur wie gesagt ich möchte nicht n-Tiefen festlegen...

EDIT 2.0: Resolved mittels Workaround
THX @ PatkIllA -> dein Beitrag hat mich auf die Idee gebracht.
Da am Bildschirm soviele Ebenen nichts verloren haben - wurden nur 20 definiert und mittels CusomEvent bei zu großer Tiefe ein neues Root-Element festgelegt. Ist technisch nicht so schön aber übersichtlicher...