.
Anmeldung | Registrieren | Hilfe
in Suchen

Anfängerfrage: ComboBox - SelectedItem aus ComboBoxItem/Stackpanel/TextBlock auslesen - wie ?

Letzter Beitrag 24. Feb 2016 8:10 von AndreD. 4 Antworten.
Seite 1 von 1 (5 Treffer)
Beiträge sortieren: Zurück Weiter
  • 07. Sep 2011 10:12

    • MichaelG
    • Nicht gereiht
    • Registriert am 07. Sep 2011
    • Beiträge 2
    • Punkte 25

    Anfängerfrage: ComboBox - SelectedItem aus ComboBoxItem/Stackpanel/TextBlock auslesen - wie ?

    Hallo,
    ich bin "WPF" Anfänger (komme aus der "Forms" Welt), habe aber schon einige Bücher (Galileo Computing) und Videos von  video2brain zum WPF Thema. Trotzdem ist es mir noch schleierhaft, wie ich auf die "Untergeordneten Properties" Zugreife.

    Kann wir jemand bitte erklären, wie ich beim Combobox1.SelectionChanged zum Beispiel den Text vom TextBlock "auslesen" kann? Unter Forms war das ja combobox.selecteditem/value.

    Wie komme ich an den Text des TextBlock innerhalb des ComboboxItem\Stackpanel ?

    Danke
    Gruß
    Michael


        <Grid>
            <ComboBox Height="44" HorizontalAlignment="Left" Margin="33,50,0,0" Name="comboBox1" VerticalAlignment="Top" Width="156" Background="{x:Null}" 
                      SelectionChanged="comboBox1_SelectionChanged" ItemsSource="{Binding}">
    
           <ComboBoxItem Background="White" Foreground="Black" FontFamily="Verdana" FontSize="12" FontWeight="Bold">
                    <StackPanel Orientation="Horizontal">
                        </Image Source=".\Images\cola.jpg" Height="40">
                        <TextBlock TextAlignment="Center" >Cola</TextBlock>
                     </StackPanel>
            </ComboBoxItem>
            
            <ComboBoxItem Background="White" Foreground="Black" FontFamily="Verdana" FontSize="12" FontWeight="Bold">
                <StackPanel Orientation="Horizontal">
                    </Image Source=".\Images\images.jpg" Height="40">
                    <TextBlock TextAlignment="Center">Cup of Coffie</TextBlock>
                </StackPanel>
            </ComboBoxItem>
                
            </ComboBox>
            
            <ListView Height="100" HorizontalAlignment="Left" Margin="46,153,0,0" Name="listView1" VerticalAlignment="Top" Width="427" />
        </Grid>

    • IP-Adresse ist Registriert
  • 07. Sep 2011 16:06 Antwort zu

    • Martin Hey
    • Top 50 Mitwirkender
      Männlich
    • Registriert am 08. Mrz 2010
    • Dresden
    • Beiträge 58
    • Punkte 965

    Anfängerfrage: ComboBox - SelectedItem aus ComboBoxItem/Stackpanel/TextBlock auslesen - wie ?

    Hallo Michael,

    das Gute an der WPF ist, dass sie sehr flexibel ist und man eben nicht mehr an feste Designs gebunden ist. Das äußert sich nun in deinem Fall aber auch so, dass man seine Anwendung etwas anders aufbauen sollte, als man es bei einer Windows Forms Anwendung machen würde.

    Mein Vorschlag: Definiere dir ein sogenanntes ViewModel in dem du alle Daten hältst, die du für die Darstellung deines Windows benötigst. An dieses kannst du dann binden. Zum Reinkommen versuch ich hier mal ne Schritt-für-Schritt-Anleitung, damit es für dich nachvollziehbar bleibt:

    a.) Definiere dir eine Klasse, die die Daten deiner Combobox Items beinhaltet - in deinem Fall sind das ja Getränke, wenn ich das richtig sehe.
    public class Drink
    {
        public string DisplayName { get; set; }
        public string ImagePath { get; set; }
    }


    b) Definiere dir ein ViewModel für dein Fenster. Dieses beinhaltet zum einen die Liste an verfügbaren Getränken und auch eine Eigenschaft, die das gerade selektierte Getränk beinhaltet.
    using System.Collections.Generic;
    
    public class MainViewModel{
        public Drink SelectedDrink { get; set; }
    
        public List<Drink> Drinks
        {
            get
            {
                return new List<Drink>
                    {
                        new Drink{DisplayName = "Cola", ImagePath = @"/WpfApplication2;component/Images/cola.jpg"} ,
                        new Drink{DisplayName = "Cup Of Coffee", ImagePath = @"/WpfApplication2;component/Images/coffee.jpg"} 
                    }
            }
        }
    }


    c) Ändere dein Window so, dass es zum einen an dein ViewModel gebunden ist, die Combobox die Daten für die Einträge aus der Eigenschaft Drinks zieht und den selektierten Wert auch wieder in die Eigenschaft SelectedDrink zurückschreibt. Bei der Gelegenheit änderst du am besten auch gleich ab, dass das ItemTemplate nur noch einmal definiert wird - schließlich sollen deine Einträge ja alle gleich aussehen.
    <Window x:Class="WpfApplication2.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
            xmlns:my="clr-namespace:WpfApplication2"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <my:MainViewModel x:Key="mainViewModel" />
        </Window.Resources>
        <Grid x:Name="MainGrid" DataContext="{StaticResource mainViewModel}">
            <ComboBox Height="44" HorizontalAlignment="Left" Margin="33,50,0,0" Name="comboBox1" VerticalAlignment="Top" Width="156" Background="{x:Null}" 
                      ItemsSource="{Binding Drinks}" SelectedItem="{Binding SelectedDrink, Mode=TwoWay}" SelectionChanged="comboBox1_SelectionChanged">
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Image Source="{Binding Path=ImagePath}" Height="40" />
                            <TextBlock TextAlignment="Center" Text="{Binding DisplayName}" />
                        </StackPanel>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>
        </Grid>
    </Window>
    Änderungen im Vergleich zu deinem Beispiel: Es gibt eine Ressource im Window, die das ViewModel instanziiert. Diese Resource wird dem Hauptgrid als DataContext zugewiesen. Alles andere passiert per Binding.

    d) In deinem Eventhandler der Combobox - oder wo auch immer, kannst du dann direkt auf die Eigenschaft deines ViewModels zugreifen.
    private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
      {
         var viewModel = this.MainGrid.DataContext as MainViewModel;
         var seletedText = viewModel.SelectedDrink.DisplayName;
    }

    Hier siehst du auch, warum das Grid einen Namen bekommen hat.

    Vorteile:
    • Du hast das komplette Objekt gleich da und musst nicht erst noch mühsam anhand des Namens oder der Id irgendwas suchen und/oder neu erstellen.
    • Du hast Darstellung und Daten voneinander getrennt. Das ist ja einer der großen Vorteile, die die WPF bietet.
    Ich hoffe, das hilft dir etwas weiter. Bei Fragen einfach nochmal fragen, das müsste in deinen Büchern aber alles im Abschnitt Binding mit abgehandelt werden.
    Sometimes when I'm alone, I google myself.

    Blog: http://blog.martinhey.de
    Website: https://www.uniquesoftware.de
    • IP-Adresse ist Registriert
  • 07. Sep 2011 16:42 Antwort zu

    • MichaelG
    • Nicht gereiht
    • Registriert am 07. Sep 2011
    • Beiträge 2
    • Punkte 25

    Anfängerfrage: ComboBox - SelectedItem aus ComboBoxItem/Stackpanel/TextBlock auslesen - wie ?

    Hallo Martin,

    vielen, vielen Dank für deine ausführliche Erklärung !
    Jetzt ist mir die WPF-Struktur einiges klarer geworden.

    Ich habe mir deinen Code mal in meine Test Anwendung "kopiert" - und siehe da - es funktioniert :) Big Smile

    Ich werde mir das DataBinding-Kapitel noch mal genauer ansehen. Bei WPF muss man ja ein wenig umdenken im Verhältnis zu Forms...

    Gruß
    Michael

    • IP-Adresse ist Registriert
  • 23. Feb 2016 14:07 Antwort zu

    • AndreD
    • Nicht gereiht
      Männlich
    • Registriert am 23. Feb 2016
    • Leipzig
    • Beiträge 2
    • Punkte 10

    Anfängerfrage: ComboBox - SelectedItem aus ComboBoxItem/Stackpanel/TextBlock auslesen - wie ?

    Hallo Martin,

    eine Superanleitung, Danke!
    Eine Frage habe ich dennoch: Wie kann ich die ComboBoxen dazu bringen, dass sie sich neuladen? Da in meinem Fall der Datenbestand für die Boxen aus einer Datenbank kommen. Der Benutzer kann allerdings die Datenquelle ändern. Wenn das passiert müssen die ComboBoxen sich die Daten neu ziehen. Gibt es da eine elegante Lösung?

    VG
    André

    I'm not 100% practically sure of what I just wrote.
    • IP-Adresse ist Registriert
  • 24. Feb 2016 8:10 Antwort zu

    • AndreD
    • Nicht gereiht
      Männlich
    • Registriert am 23. Feb 2016
    • Leipzig
    • Beiträge 2
    • Punkte 10

    Anfängerfrage: ComboBox - SelectedItem aus ComboBoxItem/Stackpanel/TextBlock auslesen - wie ?

    OK, mit ein bisschen Googeln kann man selbst drauf kommen:
    <span style="font-size:10pt;">((ComboBox)ctrl).GetBindingExpression(ItemsControl.ItemsSourceProperty).UpdateTarget();</span><span style="font-size:10pt;">
    ist des Rätsels Lösung.
    I'm not 100% practically sure of what I just wrote.
    • IP-Adresse ist Registriert
Seite 1 von 1 (5 Treffer)

Regeln | Impressum