Ansprechen von XAML-Elementen



  • Ich möchte mehrere Textfelder mittels einer Schleife ansprechen. Kann man den Elementen irgendwie ein Array als Name zuordnen, also

    Name="feld[1]", Name="feld[2]",...

    oder kann man das irgendwie anders realisieren - vielleicht ähnlich wie bei delegate für Methoden?
    Es wäre ja langatmig, wenn ich für jedes Element eine eigene Codezeile schreiben müsste:

    feld_1.Text=""; feld_2.Text=""...



  • Die Controls-Collection einer Form verfügt über einen string-Indexer:

    TextBox tb = Controls["textBox2"] as TextBox;
    tb.Text = "huhu";

    Mit dem Name-Property der Controls kannst Du sie also ansprechen.
    In der Schleife setzt du Die Namen also einfach mit string.Format zusammen.

    Es steht Dir frei, die Controls (bzw. ihre Referenzen) in eine andere Datenstruktur zu packen. Vom einfachen Array bis zu einem Dictionary, je nachdem was benötigt wird.



  • Jetzt habe ich auch mal den Titel gelesen: XAML-Elemente.

    Sorry, obige Antwort bezieht sich auf Winforms. Für WPF bin ich zu doof.



  • AngelaMerkel schrieb:

    Ich möchte mehrere Textfelder mittels einer Schleife ansprechen. Kann man den Elementen irgendwie ein Array als Name zuordnen, also

    Name="feld[1]", Name="feld[2]",...

    oder kann man das irgendwie anders realisieren - vielleicht ähnlich wie bei delegate für Methoden?
    Es wäre ja langatmig, wenn ich für jedes Element eine eigene Codezeile schreiben müsste:

    feld_1.Text=""; feld_2.Text=""...

    Was machst du da? Das klingt alles nach einem verhunzten Design.
    Wenn du deine Schleife bauen willst benutz doch einfach die Controls-Collection und iteriere diese.



  • Firefighter schrieb:

    Was machst du da? Das klingt alles nach einem verhunzten Design.
    Wenn du deine Schleife bauen willst benutz doch einfach die Controls-Collection und iteriere diese.

    Ich habe meine Grafikelemente mit XAML eingefügt. Dann müsste ich ja manuell erst einmal eine ControlCollection erstellen, und ich dachte, das geht nur bei WinForms.



  • Also wenn du irgendwelche Controls in deinem XAML definierst, dann kannst du die Children oder Controls Colletion des darueber liegenden Containers abfragen, zum beispiel dein Grid oder je nach dem wo deine Controls drinne liegen.



  • Die interessantere Frage ist: Was möchtest Du machen? In WPF kann man Controls über Databindung mit daten verbinden.



  • Ich habe 3x3 TextBox-Elemente, denen ich bei einem Methodenaufruf jeweils einen zufälligen Wert zuweisen möchte.
    Ich möchte diese 9 Elemente irgendwie über eine Schleife bearbeiten und abrufen können (möglichst zeilen- und spaltenweise), aber ich kann ja ein Element nicht mehreren Containern zuordnen...oder?

    Grafische Anordnung der 9 Elemente:
    1 2 3
    4 5 6
    7 8 9
    kann ich da einen Container spalte_1 machen mit (1,4,7) sowie einen Container zeile_1 mit (1,2,3)?



  • Implementiere es so das es dem Code Scheißegal ist wie die Items angezeigt werden.
    Pack die Dinger einfach in eine Liste.

    Pseudocode (hier im Forum getippt)
    C#

    public EnhancedObservableCollection<int> Values { get; set; }
    Values.AddRange(new[] { 1,2,3,4,5,6,7,8,9 });
    

    Xaml

    <ItemsControl ItemsSource="{Binding Values}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Columns="3" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemsTemplate>
            <DataTemplate>
                <Border BorderBrush="Pink" BorderThickness="1">
                    <TextBlock Text="{Binding }" />
                </Border>
            </DataTemplate>
        </ItemsControl.ItemsTemplate>
    </ItemsControl>
    

    Dann kannst du am Ende einfach die Values Liste anpassen, die UI kümmert sich von ganz allein um den Rest.



  • Ich habs probiert und es klappt auch endlich. Auf diese Idee wäre ich nie gekommen, denn ich wollte ja alle Objekte erst eindeutig irgendwo in XAML erstellen



  • Man sollte hat Logik und UI immer strikt voneinander trennen. Dadurch bekommt man sowas automatisch.


Anmelden zum Antworten