Laden...

[gelöst]Items in Listbox werden unsichtbar angezeigt

Erstellt von Farma vor 10 Jahren Letzter Beitrag vor 10 Jahren 3.753 Views
F
Farma Themenstarter:in
9 Beiträge seit 2013
vor 10 Jahren
[gelöst]Items in Listbox werden unsichtbar angezeigt

Hi Leute

Ich hab ein kleines Problem und zwar erzeuge ich per Code eine List<Person>. Die Klasse Person enthält derzeit nur Name, Alter, Adresse (get,set).


public MainWindow()
        {
            InitializeComponent();
            libAngestellte.ItemsSource = CreatePeople();
            libAngestellte.DisplayMemberPath = "Alter";
            libAngestellte.SelectedIndex = 0;
            libAngestellte.Focus();
            

        }

        private List<Person> CreatePeople()
        {
            List<Person> liste = new List<Person>();
            liste.Add(new Person("Name", 100, "Adresse"));
            liste.Add(new Person("AnotherName", 90, "Adresse2"));
            return liste;
        }

libAngestellte ist meine Listbox.
Warum werden mir jetzt nicht die Namen angezeigt sondern nur leere Einträge wie im anghängten Bild gezeigt?

W
113 Beiträge seit 2006
vor 10 Jahren

Hallo Farma,

der Name würde sowieso nicht angezeigt werden da du als DisplayMemberPath "Alter" angibst. Somit müsste eigentlich das Alter angezeigt werden. Ich weiß aber nicht genau ob WPF in diesem Fall ToString() aufruft.

Wenn du willst dass die ListBox den Namen anzeigt musst du diesen als DisplayMemberPath setzen.

mfg,
xan

F
Farma Themenstarter:in
9 Beiträge seit 2013
vor 10 Jahren

Auch das habe ich schon probiert bzw. habe ich auch noch die Adresse probiert, allerdings mit dem selben Ergebnis.

211 Beiträge seit 2008
vor 10 Jahren
  1. Ja WPF ruft immer ToString() auf beim darstellen von Datentypen die nicht graphischer Natur sind (UIElement).

  2. Für die "wirkliche" Lösung des Problems müssten wir Wissen, wie die Klasse "Person" aufgebaut ist, und welche Properties dafür vorhanden sind

  3. Würde ich das vor allem im XAML lösen, da das deutlich komfortabler ist (sobald man es etwas lesen/schreiben gelernt hat)

  4. Wie immer bei WPF: Binding würde dir auch hier einiges ersparen. Deswegen verweise ich gerade mal eben auf diesen Thread hier, da hängt ein wirklich sehr kleines Beispiel drin. (Link)

Kontakt & Blog: www.giesswein-apps.at

F
Farma Themenstarter:in
9 Beiträge seit 2013
vor 10 Jahren

@LatinChriz vielen Dank für deine Hilfe/Anregung. Allerdings bin ich erst vor kurzem von WindowsForms auf WPF umgestiegen deswegen versuche ich gerade Bindungen zu lernen.

Die Klasse Person enthält als Properties nur string Name, string Adresse, int Alter mit get und set jeweils.


<Window x:Class="BindingÜ1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="311" Width="525">
    
    <Window.Background>
        <LinearGradientBrush StartPoint="0,1" EndPoint="0,0" >
            <GradientStop Color="Blue" Offset="0"></GradientStop>
            <GradientStop Color="WhiteSmoke" Offset="1"></GradientStop>
        </LinearGradientBrush>
    </Window.Background>
    <Grid >
        <Grid.RowDefinitions>            
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>            
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        
        <ListBox Name="libAngestellte" Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" Margin="10"></ListBox>
        <Grid Grid.Row="0" Grid.Column="1" Margin="5" DataContext="{Binding ElementName=libAngestellte, Path=SelectedItem}">
            <Grid.RowDefinitions>
                <RowDefinition></RowDefinition>
                <RowDefinition></RowDefinition>
                <RowDefinition></RowDefinition>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
        <Label Name="lbName" Grid.Column="0" Grid.Row="0" Content="Name:" Margin="15,5,5,5" HorizontalContentAlignment="Left" VerticalContentAlignment="Center"></Label>
        <Label Name="lbAlter" Grid.Column="0" Grid.Row="1" Content="Alter:" Margin="15,5,5,5" HorizontalContentAlignment="Left" VerticalContentAlignment="Center"></Label>
        <Label Name="lbAdresse" Grid.Column="0" Grid.Row="2" Content="Adresse:" Margin="15,5,5,5" HorizontalContentAlignment="Left" VerticalContentAlignment="Center"></Label>
        <TextBox Name="tbName" Grid.Column="1" Grid.Row="0" Margin="5" Text="{Binding Path=Name}"></TextBox>
        <TextBox Name="tbAlter" Grid.Column="1" Grid.Row="1" Margin="5" Text="{Binding Path=Alter}" ></TextBox>
        <TextBox Name="tbAdresse" Grid.Column="1" Grid.Row="2" Margin="5" Text="{Binding Path=Adresse}"></TextBox>
        </Grid>
    </Grid>
</Window>

Das ist derzeit mein Fenster. Jedesmal wenn ich die Selektion wechsle in der Listbox soll mir eben rechts davon die Daten angezeigt werden. Das Komische ist ja immer das die Einträge in der Listbox unsichtbar angezeigt werden.
So schaut das Programm dann im wesentlichen aus.

4.939 Beiträge seit 2008
vor 10 Jahren

Hallo Farma,

der XAML-Code ist ja auch inkorrekt.
Du erzeugst eine leere ListBox und ein Grid mit 0 Zeilen (und einer Spalte).

Du benötigst für die ListBox ein Unterelement ListBox.ItemTemplate, in das du dann ein DataTemplate packst, s. z.B. WPF tutorial: The ListBox control (unter "Data binding the ListBox").

F
Farma Themenstarter:in
9 Beiträge seit 2013
vor 10 Jahren

Vielen herzlichen Dank für deine Hilfe jetzt funktionierts. Ich musste nur die Klasse Person konstrukterlos und das mit den Templates machen. 👍 😁