DataGrid wird nicht aktualisiert (Gebunden DataView, INotifyPropertyChanged)

  • WPF

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    DataGrid wird nicht aktualisiert (Gebunden DataView, INotifyPropertyChanged)

    Hallo liebe Leute,
    bestimmt schon mehrmals angesprochen aber ich machs nochmal.
    Ich habe eine WPF-Anwendung mit DataGrid und mehreren Filterboxen.
    Meine Klasse Main Implementiert die Klasse INotifyPropertyChanged für die Datenbindung.

    Des weiteren habe ich die Propertys AuftrageDT und dView

    VB.NET-Quellcode

    1. Private _dView As New DataView
    2. Public Property dView As DataView
    3. Get
    4. Return _dView
    5. End Get
    6. Set(ByVal value As DataView)
    7. _dView = value
    8. OnPropertyChanged("dView")
    9. End Set
    10. End Property


    und

    VB.NET-Quellcode

    1. Private _AuftrageDT As New DataTable
    2. Public Property AuftrageDT As DataTable
    3. Get
    4. Return _AuftrageDT
    5. End Get
    6. Set()
    7. _AuftrageDT = New DataTable()
    8. OnPropertyChanged("AuftrageDT")
    9. End Set
    10. End Property


    Beim Programmstart wird der DataContext gebunden und dem DataView die DefaultView des DataTables übergeben:

    VB.NET-Quellcode

    1. DataContext = Me
    2. dView = AuftrageDT.DefaultView


    In der WPF bekommt das DataGrid die DataView zugewiesen.

    XML-Quellcode

    1. <DataGrid CanUserSortColumns="True" CanUserReorderColumns="True" IsReadOnly="true" Grid.Row="6" Grid.Column="1" AutoGenerateColumns="False" Grid.ColumnSpan="15" SelectionUnit="FullRow" Name="AuftragsinfoGrid" SelectionMode="Single" ItemsSource="{Binding dView,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}">



    Nun lade ich beim ersten Start ein paar Werte über die Funktion "LadeOffeneAufträge". Gebe ich nun einen Filter an, lädt er in der Sub die richtigen Daten aus der Datenbank, allerdings bleibt mein DataTable leer und der letzte Stand wird angezeigt

    VB.NET-Quellcode

    1. Private Sub LadeOffeneAufträge()
    2. Dim ZusatzFilter As String = BuildFilterString()
    3. If ZusatzFilter.Length > 0 Then
    4. If ZusatzFilter.Substring(0, 4) = " and" Then
    5. ZusatzFilter = ZusatzFilter.Substring(4, ZusatzFilter.Length - 4)
    6. End If
    7. 'Lädt alle Offenen Aufträge wenn ein Filter vorhanden ist
    8. Funktionen.SQLFunktionen.LadeAlleOffenenAufträge(AuftrageDT, ZusatzFilter)
    9. Else
    10. 'Lädt alle Offenen Aufträge ohne Filter
    11. Funktionen.SQLFunktionen.LadeAlleOffenenAufträge(AuftrageDT)
    12. End If
    13. FilterLBL.Content = "Filter: Offene Aufträge"
    14. End Sub


    Die Sub Zusatzfilter benötige ich um die entsprechenden Eingaben aus der Textbox zu einem Where String zu verketten.

    Vorher habe ich das ganze im DataView gefiltert (RowFilter), was auch super funktioniert hat.

    Allerdings werden dann die Daten ja nicht aktualisiert.
    Das muss aber so sein, daher versuche ich die Daten zu aktualisieren sobald ich auf (z.b.) Offene Aufträge drücke.

    Hoffentlich könnt ihr mir ein paar Anregungen bringen:)
    Das würde nur neu geladen werden (OnPropertyChanged), wenn du eine neue DataTable zuweist... Wenn du einen Wert in der DataTable änders, passiert nichts.

    Tausche mal die DataTable gegen eine ObservableCollection. Die hat ein NotifyOnPropertyChanged integriert...

    Edit:
    Oder mach ein ICollectionView und aktualiser den mit Refresh()
    NETworkManager - A powerful tool for managing networks and troubleshoot network problems!
    Hallo @Schwakowiak

    In der WPF läuft alles was mit Filtern, Sortieren, Gruppieren oder Navigieren zu tun hat über eine ICollectionView. Was dann wieder auf diese IcollectionView gebunden ist (DataGrid, ListBox, ListView usw.) ist dann eigendlich egal.

    Wichtig ist nur. Verwende wenn sich zur laufzeit Eigenschaften ändern immer INotifyPropertyChanged und wenn sich die Auflistung ändert eine ObservableCollection da diese INotifyCollectionChanged implementiert. Erstelle eine CollectionView und Binde darauf.

    Hier ein guter Link. Das ist wirklich kurz und knapp ohne viel schnick schnack erklärt wie es funzt.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.