Red - Mi 01.07.15 13:47
Titel: Combobox mehrspaltig SelectedItem
Ich beiß mir hier die Zähne an folgender Aufgabe aus:
Ich hab einen Datareader, der eine Combobox befüllen soll. Hier hab ich 2 Spalten - die Id und die Bezeichnung.
Für den User würde die Anzeige der Bezeichnung reichen, wobei beide Spalten besser wären. Die Id brauch ich für die Auswertung der Selektion. Die Combobox wird korrekt angezeigt.
Meine 2 Fragen:
Wie erhalte ich die Id (=S1SHK) aus der selektierten Zeile, nachdem die selektierte Zeile kein Einzelwert ist?
Kann ich beim "betanken" der Combobox die Vorauswahl nur durch den Index als Zeilenzähler vornehmen, oder geht es auch direkt über die Id "S1SHK"?
Mein bisheriger Ansatz sieht folgendermaßen aus:
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| <Window.Resources> <DataTemplate x:Key="cbxProduktionsketteTemplate"> <StackPanel Orientation="Horizontal"> <Border BorderThickness="1" Width="200" BorderBrush="Gray" Padding="0"> <TextBlock Text="{Binding Path=S1SHK}"/> </Border> <Border BorderThickness="1" Width="200" BorderBrush="Gray" Padding="0"> <TextBlock Text="{Binding Path=S1BEZ}"/> </Border> </StackPanel> </DataTemplate> </Window.Resources>
<ComboBox x:Name="cbxProduktionskette" HorizontalAlignment="Left" Margin="60,0,0,0" BorderThickness="1" VerticalAlignment="Top" Height="20" Width="200" Background="Yellow" ItemTemplate="{StaticResource cbxProduktionsketteTemplate}" Style="{DynamicResource ComboBoxStyleGelb}" SelectionChanged="cbxProduktionskette_SelectionChanged"> <ComboBox.ItemsPanel> <ItemsPanelTemplate> <StackPanel Background="LightYellow" Orientation="Vertical"/> </ItemsPanelTemplate> </ComboBox.ItemsPanel> </ComboBox> |
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| while (myReader.Read()) { temptbl.Add(new cbxProduktionskettenzeile() { S1SHK = myReader.GetString(0).ToString(), S1BEZ = myReader.GetString(1).ToString() }); }
cbxProduktionskette.ItemsSource = temptbl;
private void cbxProduktionskette_SelectionChanged(object sender, SelectionChangedEventArgs e) { }
public class cbxProduktionskettenzeile { public string S1SHK { get; set; } public string S1BEZ { get; set; } } |
Besten Dank für eure Unterstützung ...
Moderiert von
Th69: XML-Tags hinzugefügt
Moderiert von
Th69: C#-Tags hinzugefügt
Th69 - Mi 01.07.15 16:18
Hallo Red,
hier siehst du jetzt wohl, daß es mit dieser Vorgehensweise bei WPF schwer wird, weiterzukommen.
Wie in
Binding aktualisiert nicht [
http://www.entwickler-ecke.de/viewtopic.php?t=114390] schon geschrieben, rate ich dir zu MVVM, so daß du dann im ViewModel mit den konkreten Daten und Typen arbeiten kannst (anstatt über die WPF-Controls, welche nur
object als
ItemsSource kennen, d.h. du per Casting arbeiten müßtest).
Red - Do 02.07.15 14:19
Hallo Th69,
in meinem ersten Beitrag lag der Pferdefuß im MVVM, da hier explizit OnPropertyChanged angegeben werden musste.
Aber sollte es jemanden interessieren, hier der von dir angesprochene funktionierende CAST:
C#-Quelltext
1: 2: 3: 4: 5:
| private void cbxProduktionskette_SelectionChanged(object sender, SelectionChangedEventArgs e) { var selectedKombi = cbxProduktionskette.SelectedItem as cbxProduktionskettenzeile; MessageBox.Show(selectedKombi.S1SHK); } |
Moderiert von
Th69: C#-Tags hinzugefügt