Laden...

Grid in XAML dynamisch erweitern

Erstellt von Quaneu vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.775 Views
Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 6 Jahren
Grid in XAML dynamisch erweitern

Hallo zusammen,

eine Frage kommt selten alleine...

Ich probiere schon seid Stunden folgendes Problem zu lösen. Ich habe ein UserControl, in dem ein Grid definiert ist mit z.B. 3 Zeilen und 2 Spalten. Nun würde ich an den Stellen, an dem ich das UserControl benutze das Grid so erweitern, dass ich Zeilen hinzufügen kann, die dann die selben Spaltenbreiten haben, wie das Grid im UserControl. Leider finde ich keine Möglichkeit dies umzusetzen.
Ich habe es schon mit einem DependencyProperty "FurtherContent" probiert, das ich setzten kann und im PropertyChangedCallback das Grid dynamisch erweitere.
Doch leider klappt dies nicht. Wenn z.B. "FurtherContent" vom Typ Grid ist so kommt im PropertyChangedCallback ein Grid an, dass nie Children hat, obwohl im XAML welche definiert sind.

Schöne Grüße
Quaneu

2.079 Beiträge seit 2012
vor 6 Jahren

Das Grid kann von Haus aus nicht dynamisch erweitert werden.
Du hast also drei Möglichkeiten:
1.Du regelst alles über CodeBehind
Im CodeBehind kannst Du dann je nach Anforderung Spalten, Zeilen und Inhalte hinzufügen.

1.Du baust diese Funktion selber
Mit AttachedProperties lassen sich viele Schweinereien treiben 😉
Ich hab sowas schon mal gebaut, bei mir gab's dann AttachedProperties für

1.das Panel um die Inhalte über ItemsSource- und ItemTemplate-Properties verfügbar zu machen 1.das Grid um die Zeilen und Spalten über z.B. ColumnsCount- und RowCount-Properties steuerbar zu machen

1.Du verwendest ein ItemsControl und deklarierst es als IsSharedSizeScope
Das Grid kann Abmessungen des Zeilen/Spalten über mehrere Spalten synchronisieren.
Hierzu muss irgendein Container vor den Grid - z.B. das ItemsControl - die AttachedProperty Grid.IsSharedSizeScope auf true haben.
Alle Grids in diesem Container können sich dann untereinander synchronisieren, wenn ihre Spalten/Zeilen eine SharedSizeGroup gesetzt haben.
Mehr dazu: How to Share Star Sized Column Sizes
Beachte aber: Das funktioniert nicht immer. Ich mein, bei GridLength.Star funktioniert das nicht, kann aber auch sein, dass ich mich irre
Und beachte: Das ist nicht unbedingt das schnellste

In dem Sinne: Entscheide weise 😄

PS:
Kann man hier im Forum eine mehrdimensionale Liste auch in schön bauen?
Mein Versuch klappt ja so halbwegs, sieht bloß irgendwie beknackt aus 😄

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 6 Jahren

Hallo Palladin007,

vielen Dank für deine Hinweise. Ich werde es gleich mal ausprobieren
Das man es über CodeBehind lösen muss, war mir auch bewusst. Ich meinte mit XAML eher, dass ich in diesem den Content bereitstelle, um den das Grid erweitert werden soll. Z.B


<misc:BasicInformationUserControl.FurtherContent>
	<ItemsControl>
		<TextBox Text="A" Grid.Row="0" Grid.Column="0"/>
		<TextBox Text="B" Grid.Row="0" Grid.Column="1"/>
	</ItemsControl>
</misc:BasicInformationUserControl.FurtherContent>

Leider bekomme ich eben mit diesem Beispiel PropertyChangedCallback von FurtherContent immer ein ItemsControl ohne Items...

Schöne Grüße
Quaneu

2.079 Beiträge seit 2012
vor 6 Jahren

Dass Du das ItemsControl ohne Inhalte bekommst, könnte daran liegen, dass es initialisiert und gesetzt wird, bevor die Items hinzugefügt werden.
Halte die Instanz doch irgendwo vor und horche dort an dem CollectionChangedEvent von der Items-Property. Beachte aber: Das ist explizit implementiert

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 6 Jahren

Und nochmals vielen Dank 😃

Ich probiere es gerade mit IsSharedSizeScope. Wenn dies klappt, wäre es für mich die schönste Lösung. Aber ich habe ja jetzt noch ein paar Alternative 😉

Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 6 Jahren

VIELEN VIELEN DANK.
Mit IsSharedSizeScope klappt es wunderbar. Jetzt ist es schöner als ursprünglich angedacht 👍 👍 👍