Laden...

Wie kann ich im Codebehind in einer Schleife mehrere ScrollViewer anlegen?

Erstellt von markus_nds vor 3 Jahren Letzter Beitrag vor 3 Jahren 762 Views
M
markus_nds Themenstarter:in
6 Beiträge seit 2020
vor 3 Jahren
Wie kann ich im Codebehind in einer Schleife mehrere ScrollViewer anlegen?

Hallo,

ich komme gerae nicht weiter. Ich will im Codebehind in einer foreach Schleife mehrere ScrollViewer anlegen:


foreach (string kst in anzahlKostenstellen)
{
     crollViewer scrollviewer = new ScrollViewer();
     scrollviewer.Height = wertHeight;
     scrollviewer.Width = wertWidth;
     scrollviewer.Margin = new Thickness(0, 0, 0, 0);
     scrollviewer.HorizontalAlignment = HorizontalAlignment.Left;
     scrollviewer.VerticalAlignment = VerticalAlignment.Top;
     this.Content = scrollviewer;
}

Kann mir jemand helfen. Ich finde den Fehler nicht????

Danke, Markus

4.931 Beiträge seit 2008
vor 3 Jahren

Mit deiner letzten Anweisung überschreibst du immer wieder den Wert von Content, d.h. nur das zuletzt zugewiesene Control bleibt sichtbar.
Wenn du mehrere ScrollViewer angezeigt bekommen möchtest, dann solltest du ein passendes Layout-Control, z.B. StackPanel dafür benutzen.

Mittelfristig solltest du aber zu [Artikel] MVVM und DataBinding wechseln.

M
markus_nds Themenstarter:in
6 Beiträge seit 2020
vor 3 Jahren

Ich werde das dann mal in ein Stackpanel einbinden. Ich dachte, dass ich die so einbinden könnte.

MVVM habe ich schon angeangen mich einzulesen. Ist aber schon komplex wollte ich halt vermeiden 😉))

Vielen Dank!

190 Beiträge seit 2012
vor 3 Jahren

Hallo markus_nds,
ich lese hier immer wieder, dass MVVM schwierig, komplex oder sonst was ist und stolpern dann von einem Codebehind-Problem zum nächsten. Der Code wird immer komplexer und irgendwann nicht mehr nachvollziehbar. Die entsprechenden Pattern sind nicht umsonst da. Gerade wenn man damit anfängt, sind bestimmte Richtlinien sehr hilfreich. Und sorgt auch für weniger Stress im Forum 😉.

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

16.807 Beiträge seit 2008
vor 3 Jahren

Vor allem kann man MVVM bei WPF kaum vermeiden, weil WPF mit MVVM konzipiert wurde.
Verwendet man kein MVVM, dann hangelt man sich von Workaround zu Workaround bis zu dem Punkt, an dem man gar nicht mehr weiter kommt / kommen kann.
Ist leider also nur eine Frage der Zeit, bis man auf der Schiene gegen die Wand fährt.

M
markus_nds Themenstarter:in
6 Beiträge seit 2020
vor 3 Jahren

Vielen Dank für Eure Hinweise! Ich bin mir schon bewusst, dass MVVM und DataBinding Sinn macht. Habe nur bisher vermieden mich einzuarbeiten.

In diesem Fall will ich ein dynamisches Raster von ViewScrolls erstellen. D.h. ich will je nach Daten beim öffnen des Windows z.B. 3x3 oder 3x4 oder 2x2 ScrollViews haben, die sich automatisch an das Raster anpassen. Das habe ich noch nicht in MVVM gesehen und habe mir gedacht ich "bastel" mir das so. Da den Inhalt der ScrollViews immer aktualisieren will mach bhier DadaBinding aber wirklich Sinn....

190 Beiträge seit 2012
vor 3 Jahren

Suchst du sowas?


       <ItemsControl ItemsSource="{Binding MyCollection}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <ScrollViewer>
                        <.../>                       
                    </ScrollViewer>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

2.078 Beiträge seit 2012
vor 3 Jahren

Oder willst Du etwas analog zum Windows10-Startmenü?
Dann such nach "Tiles", so heißen die Kacheln - sicher gibt's schon geeignete Implementierungen, MahApps hat glaub eine.

Ich hab mir sowas mal mit einem Grid gebaut, da das sich auch an Größenänderungen anpassen kann.
Parallel dazu habe ich mir eine Extension gebaut, dia Row- und ColumnDefinitions frei binden lassen, das geht ganz gut mit AttachedProperty oder Behaviors, ist allerdings auch nicht gerade super einfach.

M
4 Beiträge seit 2021
vor 3 Jahren

Hallo,

ich habe ein ähliches Problem. Vielleicht hat ja jemand eine Idee:

Ich habe ein WPF-Programm mit MMVM. Ich bekomme auch alles hin. Nun will ich aber mehrere ListViews erstellen. Und zwar nach dem Programmaufruf automatisch in unterschiedlicher Anzahl. Je nach einer bestimmten Menge von unterschiedlichen Kostenstellen (kommen aus eine INI). Diese sollen dann mittels Binding aus einer Datenbank gefüllt werden.
Im ViewModel kriege ich ja das ListView z.B. in einer foreach Schleife mehrmals instanziiert, aber wie mache ich das dann mit dem Bindig, da auf jedem ListView, passend zu der entsprechenden Kostenstelle, was angezeigt werden soll.

Ich stehe total auf dem Schlauch…

Marc

PS: Ich wollte einmal sagen, was das für ein tolles Forum ist! Ich habe mich zwar gerade erst angemeldet, aber vorher konnte ich mir mit den vielen tollen Beiträgen schon sehr weiterhelfen. Ich hoffe, dass ich nun auch so weit bin andere zu unterstützen!

5.657 Beiträge seit 2006
vor 3 Jahren

Im ViewModel kriege ich ja das ListView z.B. in einer foreach Schleife mehrmals instanziiert

Dann verwendest du ja kein Binding. Nimm stattdessen lieber ein ItemsControl, das du an eine ObservableCollection bindest. So wie in dem Beispiel von Wilfried, oder in den Beispielen in [Artikel] MVVM und DataBinding

Weeks of programming can save you hours of planning

M
4 Beiträge seit 2021
vor 3 Jahren

Hallo,

ich habe jetzt an meinem Projekt längere Zeit gebastelt. Ich habe Eure Vorschläge mit MVVM und dem Itemscontrol umgesetzt. Es funktioniert alles soweit. Jetzt will ich aber für die Kind-Controls in meinem Itemscontrol jewils einzelne Werte, wie z.B. den Text von testTextBlock setzen. Wie kriege ich das hin?

Wie komme ich z.B. an das die einzelnen Text-Elemente von den erstellten Text Blöcken???


    <WrapPanel Orientation="Horizontal">
            <WrapPanel.Children>
            <ItemsControl x:Name="maschinenControl">
                <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel/>
                </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <Border BorderBrush="Blue" BorderThickness="1">
                            <StackPanel Orientation="Horizontal">
                                    <StackPanel Orientation="Vertical">
                                        <TextBlock Text="{Binding}"/>
                                        <TextBlock x:Name="testTextBlock" Text="TEST"/>
                                    </StackPanel>
                                </StackPanel>
                            </Border>
                        </StackPanel>
                    </DataTemplate>
            </ItemsControl.ItemTemplate>
            </ItemsControl>
            </WrapPanel.Children>
        </WrapPanel>

Könnt ihr mir da nochmal einen Tipp geben? Ich komm einfach nicht weiter. Vielen Dank!

Marc

M
4 Beiträge seit 2021
vor 3 Jahren

Das ItemSource setzte ich im Code Behind direkt auf eine Liste. Das habe ich noch nicht als Binding im WPF weil ich nur testen will, wie ich auf Items zugreifen kann.

4.931 Beiträge seit 2008
vor 3 Jahren

Aber das ist doch der ganze Sinn des Bindings, daß du dann vom ViewModel auf die Liste (ObservableCollection<...>) und dessen Elemente zugreifen kannst.

M
4 Beiträge seit 2021
vor 3 Jahren

Das ist mir klar. Ich will aber erstmal mit einer Liste mehrere Elemente im Itemscontrol erzeugen. Je nach Element will ich dann eigentlich eine entsprechende Datenbakabfrage starten und dann entsprechend die Elemente des ItemControls füllen. Ich sehe noch nicht wie ich das lösen kann. Kriege ich das auch mit der ObservableCollection hin? Dann begreif ich das noch nicht 🙂