DataGrid sortieren mit CollectionViewSource

  • WPF

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

    DataGrid sortieren mit CollectionViewSource

    Hallo zusammen!

    Ich habe mir ein kleines Testprojekt mit Datagrid und Binding an eine Datatable erstellt. soweit funktioniert es auch. Hier mal der funktionierende Code:

    XAML

    XML-Quellcode

    1. <Window x:Class="MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:Binding_Datatable"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="450" Width="800">
    9. <Grid>
    10. <Grid.ColumnDefinitions>
    11. <ColumnDefinition/>
    12. </Grid.ColumnDefinitions>
    13. <Grid.RowDefinitions>
    14. <RowDefinition Height="57*"/>
    15. <RowDefinition Height="13*"/>
    16. </Grid.RowDefinitions>
    17. <DataGrid x:Name="Timer_DataGrid1" ItemsSource="{Binding}" />
    18. <Button x:Name="Butt" Content="Zeilen einfügen" Margin="25,26.6,658.6,10" Grid.Row="1" />
    19. <Button x:Name="Butt2" Content="laden" Margin="195,26.6,486.6,10" Grid.Row="1" />
    20. <Button x:Name="Butt3" Content="speichern" Margin="371,26.6,308.6,10" Grid.Row="1" />
    21. </Grid>
    22. </Window>


    XML-Quellcode

    1. Imports System.Data
    2. Class MainWindow
    3. Private Timer_Tabelle As New Timer_KL 'Timer_KL ist die Klasse
    4. Public Sub New()
    5. ' Dieser Aufruf ist für den Designer erforderlich.
    6. InitializeComponent()
    7. ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
    8. Timer_DataGrid1.DataContext = Timer_Tabelle.Timer.DefaultView 'die Tabelle dem DataGrid zuweisen, Dazu ist im XAML das ItemsSource="{Binding}" nötig
    9. End Sub



    Als nächstes soll ein CollectionViewSource mit dazu, um die Daten sortieren und filtern zu können. Leider bin ich mit den Beeispielen aus dem Internet nicht sehr weit gekommen. Von der Seite nach der mein funktionierender Code nach gebildet ist stammt auch folgendes. War aber in C# und ich hab das übersetzten lassen.

    XML-Quellcode

    1. <Window x:Class="MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:Binding_Datatable"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="450" Width="800">
    9. <Window.Resources>
    10. <CollectionViewSource x:Key="itemCollectionViewSource" CollectionViewType="ListCollectionView"/>
    11. </Window.Resources>
    12. <Grid>
    13. <Grid.ColumnDefinitions>
    14. <ColumnDefinition/>
    15. </Grid.ColumnDefinitions>
    16. <Grid.RowDefinitions>
    17. <RowDefinition Height="57*"/>
    18. <RowDefinition Height="13*"/>
    19. </Grid.RowDefinitions>
    20. <DataGrid x:Name="Timer_DataGrid1" ItemsSource="{Binding}" DataContext="{StaticResource itemCollectionViewSource}" />
    21. <Button x:Name="Butt" Content="Zeilen einfügen" Margin="25,26.6,658.6,10" Grid.Row="1" />
    22. <Button x:Name="Butt2" Content="laden" Margin="195,26.6,486.6,10" Grid.Row="1" />
    23. <Button x:Name="Butt3" Content="speichern" Margin="371,26.6,308.6,10" Grid.Row="1" />
    24. </Grid>
    25. </Window>


    XML-Quellcode

    1. Imports System.Data
    2. Class MainWindow
    3. Private Timer_Tabelle As New Timer_KL 'Timer_KL ist die Klasse
    4. Public Sub New()
    5. 'Dieser Aufruf ist für den Designer erforderlich.
    6. InitializeComponent()
    7. ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
    8. Dim itemCollectionViewSource As CollectionViewSource
    9. itemCollectionViewSource = CType((FindResource("ItemCollectionViewSource")), CollectionViewSource) 'HIER GIBTS NE FEHLERMELDUNG
    10. itemCollectionViewSource.Source = Timer_Tabelle.Timer
    11. Timer_DataGrid1.DataContext = itemCollectionViewSource
    12. End Sub



    Eigentlich dachte ich man müsste nur die CollectionViewSource an die Tabelle binden und das Datagrid dann wiederum an an die CollectionViewSource. Scheinbar ist das wohl irgenwie komplizierter. Ich verstehe auch nicht was in der Zeile mit der Fehlermeldung überhaupt passieren soll.
    Kann mit jemand helfen ein CollectionViewSource in den funktionierenden Teil meines Codes einzubinden? Es wäre schön, wenn die Lösung nicht komplett von dem ursprünglichen Konzept abweicht, weil das halbwegs verstanden habe.

    Gruß

    eddi
    Deine Datenquelle ist ein typisiertes Dataset - das harmoniert nicht gut mit CollectionViewSource.
    Aber so wie ich das sehe, kannst du bereits jetzt sortieren.
    Hast du mal probiert, zur Laufzeit im DataGrid auf einen SpaltenHeader zu klicksen?
    Eiglich müsste der dann danach sortieren.

    Jo, habich jetzt getestet: Wenn man einem DG eine DataView als Datasource gegeben hat (wie in post#1), so ist Sorting und Filtering ebenfalls enabled.
    Allerdings ist unter der Haube der Mechanismus ein anderer als wenn man das in Wpf übliche Verfahren mitte CollectionView anwendet.

    Also zunächstmal ist an post#1 garnix zu ändern, weil Sorting und Filtering ist bereits vorhanden.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hallo @eichseinet

    Es ist gut das du mit Binding arbeiten möchtest. Das passt schon mal. Leider vermischt du es dann wieder mit dem direktzugriff.
    Einserseits hast du ein Binding auch die ItemsSource, auf der anderen Seite aber setzt du den DataContext des Controls.

    Das ist jetzt nicht falsch, hast du in einem Fenster verschiedene Controls auf verschiedene Daten gebunden verlierst du hier aber schnell den überblick. Nur so als Tipp von mir.

    Was die CollectionViewSource betrifft habe ich dieser sogar ein ganzes Kapitel in meinem Tutorial gewidmed.
    Binding an Collections mit CollectionViewSource

    Das lässt sich auch ganz gut auf deinen aktuellen Fall anwenden.

    Noch als nebentip da ich die ganzen Margins sehen:
    Vergiss unter XAML die Toolbox. Drag&Drop funktioniert zwar macht aber was es will. Schreibe den XAML - durch die IntelliSense geht das sogar schneller als wenn du ein Control draufziehst und dann erst wieder alles an Margins und der gleichen rausnehmen musst.

    Wenn du noch Fragen hast melde dich hald.

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

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Danke schon mal für die Tipps.
    Zuerst mal; ja über den Header lässt es sich sortieren. Das weiss ich auch. Ich möchte aber teilweise nach mehreren Spalten sortieren und vor allem auch filtern können. Die Filterung hab ich ganz vergessen zu erwähnen.

    Mich hat es auch gewundert, warum man ein funktionierendes Binding auf die Tabelle wie im ersten Beispiel hinbekommt und dann für ein anderes Binding plötzlich den DataContext wieder zusätzlich setzen soll.
    Leider ist mir das Tutorial von Nofear23m auf meiner Suche nicht begegnet. Das seh ich mir jetzt zuerst mal an.

    Was die Margins angeht: Da hab ich jetzt gar keinen Wert drauf gelegt, weil es nur ein Test ist , um mein eigentliches Projekt nicht durcheinander zu bringen.

    Zuletzt noch eine Frage: Gestern kam mir noch der Gedanke die Datagrid an ein Dataview zu binden. Damit wären eigentlich alle Funktionen gegeben die ich brauche. Es funktioniert auch, soweit ich das bis jetzt beurteilen kann. (noch nicht intensiv getestet)
    Man muss aber bei jeder Änderung des Dataview dieses wieder neu binden. Kann man das so lösen, oder ist das extremer Murks?

    @ErfinderDesRades: Versteh ich richtig, dass in meinem ersten funktionierenden Beispiel Filterung schon ohne ein Dataview möglich wäre? Oder meintest Du jetzt das passt dann mit dem Dataview?

    Gruß

    eddi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „eichseinet“ ()

    Ein Dataview sortiert sich durch Zuweisung an die Sort-Property, auch ggfs. hierarchische Sortierung

    VB.NET-Quellcode

    1. myDataView.Sort = "Spalte1, Spalte2 desc

    Filtern geht über die RowFilter-Property

    VB.NET-Quellcode

    1. myDataView.RowFilter = "Spalte1 > 100 And Spalte2 Like 'e*'"


    Wenndedas im Xaml definieren willst, musste tatsächlich eine CollectionViewSource dazwischenschalten, und da SortDescriptions setzen - filtern weiss ich grad garnet, probier ich gleich mal.
    Es geht! Ich Dummer!
    Hatte das DataView in der Sub deklariert und musste dann zum Filtern neu erstellen und zuweisen. War das aus Windows Forms so gewöhnt. Soweit ich mich erinnere funktionierte es unter Forms nicht, wenn das Dataview global war. Die Änderung wurde dann nicht übernommen, aber da war auch kein Binding im Spiel.
    Da die Filterung und Sortierung aus dem Code heraus kommen soll klappt das wunderbar. Ich hoffe nur es beisst sich nicht mit der nächsten Stufe; jetzt versuche ich ein Binding, um die Zellfarbe zu ändern.

    Leider hab ich wieder Schwierigkeiten den Code aus dem Beispiel von Nofear23m an mein Projekt anzupassen. Da ich mit Dataview klarkomme nutze ich nun das. (vorerst! Bis es mir doch wieder Ärger macht! :) )

    P.S. Keine Ahnung warun ich damals so nen Quatsch programmiert hab. Auch unter Forms kann man das Dataview global anlegen und die DataGridView wird durch den Filter dann aktualisiert. (gerade getestet)

    Ein dankbarer Gruß

    eddi

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

    eichseinet schrieb:

    vorerst! Bis es mir doch wieder Ärger macht!
    Tatsächlich macht es die ganze Zeit Ärger, nur bist du's nicht anders gewohnt, und dir ist net bekannt, wie man im Xaml Bindings setzen kann, wenn man ein Viewmodel hat, was keinen Ärger macht.
    guggemol Grundlagen - MVVM: "Binding-Picking" im Xaml-Editor

    Dazu muss man aber die komplette Anwendungs-Architektur auf den MVVM-Pattern ausrichten, und wie in post#2 bereits angedeutet: Mit Datasets ist BindingPicking net möglich, da musste deine Bindings eh quasi "im NachtFlug mit verbundenen Augen" setzen.

    Also ich täte empfehlen, statt sich jetzt mit Verzierung eines Datagrids zu verkünsteln, noch dazu auf DataView beruhend, sollteste deine Anwendung dem MVVM-Pattern gemäss umstrukturieren.
    Und dann überlegen, ob es Möglichkeiten gibt, von Dataset auf EF-ObjectContext-Klassen zu wechseln.

    Aber ist beides viel Arbeit. Zur MVVM-Anwendung gugge Grundlagen - MVVM-Anwendungs-Struktur
    Oder eben NoFears Riesen-Tut. Ups - sein Link funzt net - hier nochmal: Tutorialreihe <WPF lernen/>
    Anzumerken übrigens, dass ich ein anderes Verständnis von MVVM propagiere: ich lasse Teile des Patterns einfach weg, solange ich sie nicht brauche.

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

    Momentan weiss ich eigentlich noch nicht, was für mich das Richtige ist. Einerseits sollte will ich die neue Technik gleich nutzen, statt wieder viel später zu merken "Häts de mal gleich...".
    Andererseits wird mein Projekt dann erst in nem halben Jahr oder später fertig, statt in wenigen Tagen.

    Da das Programm endlich fertig werden und zum Einsatz kommen soll, wirds wahrscheinlich erst mal mit den Dataviews gemacht. Danach hab ich mehr Zeit und Geduld mich mit der ganzen neuen Technik zu beschäftigen. Da ich sowohl Neuling im WPF und nur Hobbyprogrammierer bin ist das schon ganz schön viel Stoff.
    Weil es ja auch immer so viele Möglichkeiten gibt, findet man nie das Richtige, wenn man mal was aufgebaut hat und dann weiter entwickeln will.

    gruß

    eddi
    Ich kann nur sagen - lass dich nicht entmutigen.

    Wenn man schnell an ein Ziel kommen muss spricht meiner Meinung nach nichts dagegen Anfangs ohne Binding zu Arbeiten.
    Früher oder später kommt man dann an den Punkt wo man Binding benötigt - dann sieht man sich das genauer an und probiert es aus.

    Ist man da dann wieder gut unterwegs kann man mit MVVM weitermachen. Der Mensch braucht ein Erfolgserlebnis - gleich mal WPF mit MVVM ist meiner Meinung nach nicht Zielführend da du mal Wochenlang die Techniken erlernen musst bevor sich mal was tut.

    Einfach dran bleiben, und wenn Fragen auftauchen hier nachfragen.

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

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    jo - seh ich auch so.
    Die Gefahr dabei ist halt normalerweise sehr hoch, dass man sich eine suboptimale Vorgehensweise dauerhaft angewöhnt, sobald man erst einmal damit zu einem zufriedenstellenden Ergebnis gekommen ist.
    Das ist dann bischen "innere Disziplin", dann doch noch die Aufmerksamkeit wach zu halten für andere, leistungsfähigere Ansätze.
    Da gebe ich dir natürlich vollend recht. Diese Gefahr besteht.
    Irgendwie ist es auch immer eine Gradwanderung sowas zu raten was ich oben gemacht habe - dennoch bin ich der Meinung das dies bei der WPF gar nicht sooo dragisch ist da man ohne Binding wirklich irgendwann mal an einer Wand steht und nicht weiter kann, spätestens dann muss man auch.

    Klar, je früher man damit anfängt desto besser, aber ich verstehe das man nicht gleich am Anfang 17 Techniken + neue XAML Syntax + irgendwelche Pattern lernen möchte nur weil man man schnell unter WPF ein paar Daten anzeigen lassen will. Naja, WPF eben - ist so ne Sache :huh:

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

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Habe heute das Beispiel-Projekt 2.1.4.6 aus Sascha's Tutorial nachprogrammiert. UND; es funktioniert nicht!
    Das Datagrid zeigt einfach nichts an, aber ich finde keinen Fehler an meinen Bindings oder sonstwo. Bitte dringend um Hilfe.

    XAML

    XML-Quellcode

    1. <Window x:Class="MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:DataBinding_mir_View"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="450" Width="800">
    9. <Grid>
    10. <Grid.RowDefinitions>
    11. <RowDefinition Height="170*"/>
    12. <RowDefinition Height="41*"/>
    13. </Grid.RowDefinitions>
    14. <DataGrid x:Name="Timer_DataGrid" ItemsSource="{Binding TimerView}" />
    15. <TextBox x:Name="Suchtext_TB" Text="{Binding Suchtext, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" Height="20" Width="400"/>
    16. </Grid>
    17. </Window>


    MainWindow

    VB.NET-Quellcode

    1. Imports System.ComponentModel 'nötig für INotifyPropertyChanged
    2. Imports System.Collections.ObjectModel 'nötig für die ObservableCollections
    3. Imports System.Runtime.CompilerServices
    4. Class MainWindow
    5. Implements INotifyPropertyChanged 'benachrichtigt die Oberfläche (View) bei Änderung eines Propertys (Datendings)
    6. Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    7. Private Sub raisepropertychanged() 'wird bei Änderung in den Property aufgerufen
    8. Throw New NotImplementedException()
    9. End Sub
    10. 'uchtext ist auf den Text der Textbox gebunden
    11. Private Property _suchtext As String 'temporärer Bereich von Startzeit, meldet Fehler, bis im Property get eingegeben ist
    12. Public Property Suchtext As String
    13. Get
    14. Return _suchtext 'dem Property wird die temprorräre Variable als Wert übergeben
    15. End Get
    16. Set(value As String)
    17. _suchtext = value 'der geänderte Wert des Property wird auf die temporäre Variable zurückgeschrieben
    18. TimerView.Refresh()
    19. raisepropertychanged() 'der Oberfläche wird die Änderung des Property mitgeteilt
    20. End Set
    21. End Property
    22. 'die ObservableCollection verbindet die einzelnen Propertys in der Klasse Timer_ET zu einer Einheit
    23. Private Property _timer As ObservableCollection(Of Timer_ET) 'temporärer Bereich von Startzeit, meldet Fehler, bis im Property get eingegeben ist
    24. Public Property Timer As ObservableCollection(Of Timer_ET)
    25. Get
    26. Return _timer 'dem Property wird die temprorräre Variable als Wert übergeben
    27. End Get
    28. Set(value As ObservableCollection(Of Timer_ET))
    29. _timer = value 'der geänderte Wert des Property wird auf die temporäre Variable zurückgeschrieben
    30. raisepropertychanged() 'der Oberfläche wird die Änderung des Property mitgeteilt
    31. End Set
    32. End Property
    33. 'die IcollectionView entspricht etwa einem Dataview in Forms. Sie ermöglicht filtern, sortieren und gruppieren und ist auf das DataGrid gebunden.
    34. Private Property _timerView As ICollectionView 'temporärer Bereich von Startzeit, meldet Fehler, bis im Property get eingegeben ist
    35. Public Property TimerView As ICollectionView
    36. Get
    37. Return _timerView 'dem Property wird die temprorräre Variable als Wert übergeben
    38. End Get
    39. Set(value As ICollectionView)
    40. _timerView = value 'der geänderte Wert des Property wird auf die temporäre Variable zurückgeschrieben
    41. raisepropertychanged() 'der Oberfläche wird die Änderung des Property mitgeteilt
    42. End Set
    43. End Property
    44. Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    45. Timer = New ObservableCollection(Of Timer_ET)
    46. Timer.Add(New Timer_ET("14.03.2019 15:00", "14.03.2019 15:50", "Dingsbums"))
    47. Timer.Add(New Timer_ET("11.03.2019 15:00", "11.03.2019 15:50", "TRlala"))
    48. Timer.Add(New Timer_ET("05.03.2019 15:00", "05.03.2019 15:50", "bumsbums"))
    49. Timer.Add(New Timer_ET("19.03.2019 15:00", "19.03.2019 15:50", "Dingsdings"))
    50. TimerView = CollectionViewSource.GetDefaultView(Timer)
    51. TimerView.SortDescriptions.Add(New SortDescription("Startzeit", ListSortDirection.Descending))
    52. TimerView.Filter = AddressOf Filterfunktion
    53. Me.DataContext = Me
    54. End Sub
    55. Private Function Filterfunktion(obj As Object) As Boolean
    56. If String.IsNullOrEmpty(Suchtext) Then Return True 'wenn der Suchtext NULL oder leer ist, wird true = anzeigen zurück gegeben
    57. Dim aktuellerTimer As Timer_ET = CType(obj, Timer_ET)
    58. Return aktuellerTimer.Dateiname.ToLower.Contains(Suchtext.ToLower) 'Dateiname in Kleinbuchstaben wird nach dem Suchtext in Kleinbuchstaben durchsucht und gibt true = anzeigen zurück
    59. End Function
    60. End Class


    Klasse Timer_ET

    VB.NET-Quellcode

    1. Imports System.ComponentModel 'nötig für INotifyPropertyChanged
    2. Public Class Timer_ET
    3. Implements INotifyPropertyChanged 'benachrichtigt die Oberfläche (View) bei Änderung eines Propertys (Datendings)
    4. Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged 'wird automatisch bei der Implementierung des INotifyPropertyChanged eingefügt
    5. Private Sub raisepropertychanged() 'wird bei Änderung in den Property aufgerufen
    6. Throw New NotImplementedException()
    7. End Sub
    8. Public Sub New(Startzeit1 As String, Endzeit1 As String, Dateiname1 As String) 'Sub für neue Einträge
    9. Me.Startzeit = Startzeit1 : Me.Endzeit = Endzeit1 : Me.Dateiname = Dateiname1 'Einträge den Propertys zuweisen
    10. End Sub
    11. Private Property _startzeit As String 'temporärer Bereich von Startzeit, meldet Fehler, bis im Property get eingegeben ist
    12. Public Property Startzeit As String
    13. Get
    14. Return _startzeit 'dem Property wird die temprorräre Variable als Wert übergeben
    15. End Get
    16. Set(value As String)
    17. _startzeit = value 'der geänderte Wert des Property wird auf die temporäre Variable zurückgeschrieben
    18. raisepropertychanged() 'der Oberfläche wird die Änderung des Property mitgeteilt
    19. End Set
    20. End Property
    21. Private Property _endzeit As String 'temporärer Bereich von Startzeit, meldet Fehler, bis im Property get eingegeben ist
    22. Public Property Endzeit As String
    23. Get
    24. Return _endzeit 'dem Property wird die temprorräre Variable als Wert übergeben
    25. End Get
    26. Set(value As String)
    27. _endzeit = value 'der geänderte Wert des Property wird auf die temporäre Variable zurückgeschrieben
    28. raisepropertychanged() 'der Oberfläche wird die Änderung des Property mitgeteilt
    29. End Set
    30. End Property
    31. Private Property _dateiname As String 'temporärer Bereich von Startzeit, meldet Fehler, bis im Property get eingegeben ist
    32. Public Property Dateiname As String
    33. Get
    34. Return _dateiname 'dem Property wird die temprorräre Variable als Wert übergeben
    35. End Get
    36. Set(value As String)
    37. _dateiname = value 'der geänderte Wert des Property wird auf die temporäre Variable zurückgeschrieben
    38. raisepropertychanged() 'der Oberfläche wird die Änderung des Property mitgeteilt
    39. End Set
    40. End Property
    41. End Class



    Gruß

    eddi

    *war mal so frei die Codetags zu korrigieren*

    Ja, ist mir gar nicht aufgefallen. Sitze seit über 5h an dem Projekt.

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

    Hallo

    Ich fang mal an. Ich weis, aller Anfang ist schwer:

    Warum erstellst du dir eine Hilfsmethode um INotifyPropertyChanged zu werfen, Implementierst dort aber nichts?

    VB.NET-Quellcode

    1. Private Sub raisepropertychanged() 'wird bei Änderung in den Property aufgerufen
    2. Throw New NotImplementedException()
    3. End Sub


    Normalerweise sollte es solbald du den Wert für z.b. Suchtext ändert sofort Krachen das ja die NotImplemented Exception geworfen wird da ja der Setter durchlaufen wird.
    Bring also ein wenig Code in diese Methode wenn sie in den Settern verwendet wird.

    VB.NET-Quellcode

    1. Private Sub raisepropertychanged(<CallerMemberName> Optional ByVal prop As String = "") 'wird bei Änderung in den Property aufgerufen
    2. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(prop))
    3. End Sub


    Dann funktioniert mal die Benachrichtigung an die WPF.

    Diese ganzen Privaten Properties kannst du dir sparen. Es reicht Private _suchtext As String

    Ein Tipp:
    Tipper in VisualStudio einfach Property oder prop oder Prope und drücke 2x TAB. Dann wird dir das Property automatisch erstellt.

    eichseinet schrieb:

    UND; es funktioniert nicht!

    Nur so am Rande. Alle Sache die ich jetzt gerade aufgezählt habe, habe ich so auch in genau dem Artikel den du hier ansprichst. Ich habe gerade nachgesehen. Ich wills nur gesagt haben. :S


    Nachdem dies mal ausgebessert ist wäre interessant ob und wenn ja welche "Binding-Fehler" du in der Ausgabe von Vs bekommst und WAS genau nicht funktioniert. Nur falls jetzt noch etwas nicht funktioniert.


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

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Und kaum macht man's richtig, schon geht's. Vielen Dank!
    Irgendwie hab ich das "raisepropertychanged" aus einem fehlerhaften Projekt von mir, statt aus dem Tutorial kopiert. Der einzeige Teil den ich kopiert hab und das auch noch falsch. :/
    "Private Property"... irgendwann liest man nur noch was man glaubt, was da steht. Hab's korrigiert.
    Und nu is Schluß für heute. Da kommt nix Brauchbares mehr bei raus.

    Viel Dank nochmal!

    Gruß

    eddi
    Ja, kann ja mal passiert. Ist ja nicht so schlimm.

    Wichtig ist wofür das INotifypropertyChanges eigendlich da ist. Das erklähre ich aber in einem Kapitel ganz genau. Man muss es verstehen um auf dauer spass dabei zu haben.

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

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##