Laden...

[gelöst] ListBox DataBinding mit Entity Framework

Erstellt von cav3man vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.110 Views
C
cav3man Themenstarter:in
5 Beiträge seit 2007
vor 14 Jahren
[gelöst] ListBox DataBinding mit Entity Framework

Hallo zusammen,

ich hab folgendes Problem. Ich hab eine SQL CE 3.5 Datenbank mit ein paar Tabellen die über das Entity Framework mit meiner Anwendung verknüpft wird.
In der Anwendung habe ich eine ListBox in der ich die Einträge einer Tabelle über DataBinding darstelle.
Das Funktioniert soweit ohne Probleme.

In der Maske habe ich quasi auf der linken Seite die Liste und rechts daneben ist ein Eingabedialog wo man neue Datensätze eingeben kann.

Das Problem ist das sich die Liste nicht automatisch aktualisiert sobald ein neuer Eintrag die Datenbank geschrieben wird.

XAML ListBox

<ListBox Name="BodyratingsListBox" ItemTemplate="{StaticResource BodyratingListBoxItem}" ItemsSource="{Binding}" Margin="5" />

XAML ListBoxItem Template


<UserControl.Resources>
        <DataTemplate x:Key="BodyratingListBoxItem">
            <StackPanel>
                <StackPanel Orientation="Horizontal" Margin="1">
                    <Label FontWeight="Bold" FontSize="14" Content="{Binding Path=Date}" Margin="1" />
                    <Label FontWeight="Bold" FontSize="14" Content="{Binding Path=Moods.Name}" Margin="1" />
                </StackPanel> 
                <StackPanel Orientation="Horizontal" Margin="1">
                    <Label Content="Gewicht:" Margin="1" />
                    <Label Content="{Binding Path=Weight}" Margin="1" /> 
                    <Label Content="kg" Margin="1" />
                    <Label Content="Fett:" Margin="1" />
                    <Label Content="{Binding Path=Fat}" Margin="1" />
                    <Label Content="%" Margin="1" />
                    <Label Content="Ruhepuls:" Margin="1" />
                    <Label Content="{Binding Path=PulseResting}" Margin="1" />
                </StackPanel>  
            </StackPanel>
        </DataTemplate>
    </UserControl.Resources>

Zuweisung der Entität zur ListBox

public BodyRatingInputUserControl()
        {
            [...]
            athlet = new AthletEntities();
            BodyratingsListBox.DataContext = athlet.Bodyratings;
        }

Anlegen eines neuen Datensatzes

         private void AddButton_Click(object sender, RoutedEventArgs e)
        {
            Bodyratings bodyRating = new Bodyratings();
                [... Bodyrating Properties befüllen]

                athlet.AddToBodyratings(bodyRating);
                athlet.SaveChanges();

                BodyratingsListBox.DataContext = null;
                BodyratingsListBox.DataContext = athlet.Bodyratings;

                string blah = string.Empty;

                IQueryable<Bodyratings> query = from b in athlet.Bodyratings orderby b.Date descending select b;
                foreach (Bodyratings b in query)
                {
                    blah += b.Date + " ";
                }

                MessageBox.Show(blah);
        }

Die Messagebox am Ende hab ich nur drin um zu checken ob der Datensatz auch wirklich in der Datenbank gelandet ist... und das ist er.

Ich hoffe ihr könnt mir helfen.
Schonmal danke im vorraus.

Schönen Gruß
cav3man

L
862 Beiträge seit 2006
vor 14 Jahren

von welchem Typ ist denn athlet.Bodyratings?

1.433 Beiträge seit 2006
vor 14 Jahren

Verwende ObservableCollection. Hierzu noch dieser Beitrag.

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

C
cav3man Themenstarter:in
5 Beiträge seit 2007
vor 14 Jahren

Hi

also athlet.Bodyratings ist vom Typ Bodyratings ^^ ist halt eine Entität vom Entity Data Model.

Hmm ObservableCollection ist ja schön und gut. Vielleicht hab ich das was falsch verstanden aber im Prinzip müsste ich ja dann eine ObservableCollection erstellen die ich mit der ListBox per DataBinding verbinde. Aber ich müsste ja immernoch jedes neue Object was ich der Datenbank hinzufüge manuell in die ObservableCollection schreiben... oder hab ich was falsch verstanden das man die ObservableCollection direkt mit der Entität verbinden kann.
Ich werd mir das auf jeden Fall nochmal genauer angucken.
Danke für den Tipp.

Ich hab das Problem auf jeden Fall gestern nach Stundenlangen frikeln noch gelöst bekommen... vielleicht nicht die schönste Art aber es funktioniert g

Es musste einfach nur die Stelle


BodyratingsListBox.DataContext = null;
BodyratingsListBox.DataContext = athlet.Bodyratings;

durch

BodyratingsListBox.DataContext = athlet.Bodyratings.Select(b => b);

ersetzt werden und dann läufts. Scheinbar wird die Entität nicht automatisch aktualisiert und man muss nochmal ein Select über alle Einträge laufen lassen.