Databinding ObservableCollection an DataGrid wird nicht richtig aktualisiert...

  • WPF

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    Databinding ObservableCollection an DataGrid wird nicht richtig aktualisiert...

    Hallo Leute und danke fürs reinschauen...

    kann mir jemand einen Tipp geben bezüglich meines Problems. Ich habe eine ObservableCollection und binde es im Code an ein DataGrid per ItemSource. Soweit so gut. Bloss wenn die Liste sich ändert, dann ändert sich es im DataGrid nicht so, wie die Liste. Ich muss paar mal hin und her Scrolen oder igend wie im DataGrid was anklicken, damit es aktualisiert wird. Kennt jemand das Problem? Was kann ich machen? UpdateLayout hilft nicht... ?(

    Danke im Voraus.
    Hey @EugenIS
    was genau geschieht denn, wenn du etwas anklickst? Irgendeine Methode müsste doch hinterlegt sein, dass sich dein DGV aktualisiert?
    Also wenn ich mein DGV über VB aktualisieren möchte mache ich folgendes: DGV.DataSource = Nothing. Anschließend wird wieder alles an Daten abgefragt und an das DGV gebunden.
    Option Strict On!
    Da läuft eine Methode SelectionChanged...

    Sprich ich löse ein Event aus...

    Eigentlich sollte man es so nicht machen, wie du es vorschlägst. Denn Binding ist ja dafür da, dass es sich von allein aktualisiert. Sonst macht es ja wenig Sinn.
    Von Prinzip her sollte es egal sein, oder sehe ich es falsch?

    Jedenfalls habe ich einen Event abboniert, wenn sich die Collection ändert. Dann setzte ich sowie der Drahuverar das meinte einmal auf null, und hinterher gleich den sender in ItemSource. Funktioniert gut. Ist aber nicht ganz so was ich haben will... Das muss eigentlich von alleine gehen.

    Ich werde es mal mit xaml probieren. Vielleicht ist es doch was anderes...




    So, hab es ausprobiert. Verhält sich genau so...
    Irgend wie aktualisiert sich DataGrid nicht richtig...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „EugenIS“ ()

    Ich hab das einfach mal ganz Simple nachgebaut und konnte das Verhalten nicht nachstellen:

    XML-Quellcode

    1. <Window x:Class="WpfApplication1.MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:local="clr-namespace:WpfApplication1"
    5. Title="MainWindow" Height="350" Width="525">
    6. <Window.DataContext>
    7. <local:MainWindowViewModel x:Name="vm" />
    8. </Window.DataContext>
    9. <Grid>
    10. <Grid.RowDefinitions>
    11. <RowDefinition />
    12. <RowDefinition Height="50" />
    13. <RowDefinition Height="50" />
    14. </Grid.RowDefinitions>
    15. <DataGrid ItemsSource="{Binding Persons}" />
    16. <Button Grid.Row="1" Content="Neu" Command="{Binding NewPersonCommand}" />
    17. <Button Grid.Row="2" Content="Del" Command="{Binding DeletePersonCommand}" />
    18. </Grid>
    19. </Window>


    Viewmodel:

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Collections.ObjectModel;
    4. using System.Linq;
    5. using System.Text;
    6. using System.Threading.Tasks;
    7. using System.Windows.Input;
    8. namespace WpfApplication1
    9. {
    10. public class MainWindowViewModel
    11. {
    12. public ObservableCollection<Person> Persons { get; set; }
    13. public MainWindowViewModel()
    14. {
    15. Persons = new ObservableCollection<Person>();
    16. Persons.Add(new Person { Alter = 2, Name = "Mario" });
    17. Persons.Add(new Person { Alter = 4, Name = "Hans" });
    18. Persons.Add(new Person { Alter = 6, Name = "Fritz" });
    19. NewPersonCommand = new RelayCommand(() => Persons.Add(new Person { Alter = 20, Name = "Neue Person" }));
    20. DeletePersonCommand = new RelayCommand(() => Persons.RemoveAt(0), () => Persons.Count > 0);
    21. }
    22. public ICommand NewPersonCommand { get; set; }
    23. public ICommand DeletePersonCommand { get; set; }
    24. }
    25. }


    Die Person Klasse hat nicht mal INotifyPropertyChanged implementiert. Und RelayCommand sollte denk ich klar sein.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    EugenIS schrieb:

    Von Prinzip her sollte es egal sein, oder sehe ich es falsch?


    Meist ists ein DesignFehler, wenn man Wpf anders verwendet als wie es ausgelegt ist.

    Ausserdem kann kaum einer dabei helfen, denn mit so exotischen Vorgehensweisen kennt man sich nicht aus.

    Womöglich ist auch garnet geraten, beim Exoten-Weg weiterzuhelfen - das wäre ja ein Bärendienst, der dich nur davon abhielte, die Wpf-Konzepte so anwenden zu erlernen, wie sie gedacht sind.
    Jedenfalls wenn das eigliche Vorhaben auf Standard-Weise besser gelöst wäre.
    Jou, um mich da noch in ein besseres Licht zu rücken; Wenn das DGV noch unabhängig von dem Binding Spalten hinzugefügt bekommt, macht das in dem Fall sinn.. War dann wohl 'ne blöde Bemerkung von mir, sorry hierfür.
    (<OT>Aber vielleicht habe ich das auch falsch verstanden und man müsste anstelle der zusätzlich hinzugefügten Spalte(n) das schon im Binding deichseln,.. das würde ich aber demnäcsht mal in 'nem neuen Thread auslagern zum kommentieren, mit Beispiel etc.</OT>)

    Kannst du dein Projekt evtl. abspecken und hier mit uns teilen?
    Option Strict On!

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Drahuverar“ ()

    Ist in Prinzip das was fichz schon dargestellt hat. Nur das es noch eine andre klasse ist, die die Personen in die liste reinschmeißen kann... Ich sehe auch, dass die Liste sich ändert. Leider wird das DataGrid nicht nach meinen Vorstellungen angezeigt.

    Was das Binding in WPF angeht, ich habe es per xaml gebunden. Das verhalten ist genau so...
    Was steht denn da drin, in SelectionChanged ?
    Im DataGrid ist ja mal schnell etwas "ausgewählt", musst du den Inhalt vielleicht noch überprüfen, bevor du mit der Methode in dem Event beginnst? Ist das vllt. der Grund weswegen du ein paar mal hin und her scrollen musst oder was anklicken musst? Kann ja sein, das es Probleme mit dem in dem Grid befindlichen Datentyp gibt~..?
    Option Strict On!
    Du schreibst, dass du die Liste "aktualisierst". Wie machst du das genau, bzw. was änderst du? Hier ist eine Liste von Fehlern, die dabei gerne passieren: updatecontrols.net/doc/tips/co…akes_observablecollection - in erster Linie darfst du die Collection nicht ersetzen (oder musst sie neu binden).

    Falls du nur eine Eigenschaft eines Elements der Collection änderst, erfolgt kein Update, weil sich dadurch die Collection selbst nicht ändert. Siehe dazu: stackoverflow.com/questions/17…t-update-items-properties
    Gruß
    hal2000