Entity Framework - Problem mit Durchgriff auf NavigationProperty in 2.Ebene

  • WPF

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von kaifreeman.

    Entity Framework - Problem mit Durchgriff auf NavigationProperty in 2.Ebene

    Hallo,
    Ich hab hier ein kleines Problem mit einer Bindung die eine n:m Relation abbildet und in einem Listview dargestellt werden soll.

    Ausgangssituation im Datenmodell:


    Die Entität transactions_v01 enthält meine Buchungen die 1:m Relation wird über die Entität trans_2_kat und dann noch über eine category_v01 Entität abgebildet.

    Die Navigationsproperties sind wie folgt definiert:

    Nav Prop von der Transaktionstabelle zur Relationstabelle trans_2_kat

    VB.NET-Quellcode

    1. Public Overridable Property nv_trans_t2k As ICollection(Of trans_2_kat) = New HashSet(Of trans_2_kat)


    und dann noch eine weitere von der Relationstabelle trans_2_kat auf die Kategorien:

    VB.NET-Quellcode

    1. Public Overridable Property nv_category_t2k As category_v01


    Soweit so gut nun habe ich eine Form in der die Transaktion erstellt wird in dieser liegt auf einem eigenen Tabitem eine Listview die die der jeweiligen Buchung zugeordneten Kategorien mit "bezeichnung" und "amount" abbilden soll:

    XML-Quellcode

    1. <ListView x:Name="lvw_kat" DockPanel.Dock="Top" Background="#FFF0F0F0" ItemsSource="{Binding nv_trans_t2k, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" IsSynchronizedWithCurrentItem="True" DataContext="{Binding Transactions}">
    2. <ListView.View>
    3. <GridView>
    4. <GridViewColumn Header="Kategorie" Width="120" DisplayMemberBinding="{Binding /nv_category_t2k/bezeichnung}" />
    5. <GridViewColumn Header="Betrag" Width="50" DisplayMemberBinding="{Binding amount}" />
    6. </GridView>
    7. </ListView.View>
    8. </ListView>


    Das hinzufügen der Kategorien funktioniert es wird zwar das Listview nicht automatisch geupdatet aber das liegt wohl an einem fehlenden INotifyPropertyChanged aber das ist erstmal sekundär.

    Leider kommt mir in der Spalte "Kategorie" (da wo die Property bezeichnung aus der Entität category_v01 angezeigt wird) diese Fehlermeldung:
    ​System.Windows.Data Error: 40 : BindingExpression path error: 'nv_category_t2k' property not found on 'current item of collection' ''trans_2_kat' (HashCode=46279768)'.
    BindingExpression:Path=/nv_category_t2k/bezeichnung; DataItem='trans_2_kat' (HashCode=46279768); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')


    Interessanterweise zeigt er mir den "amount" in der nächsten Spalte richtig an.

    Kann mir dabei jemand weiterhelfen?

    Danke!
    mfG.
    Stephan
    probierma

    XML-Quellcode

    1. <ListView x:Name="lvw_kat" DockPanel.Dock="Top" Background="#FFF0F0F0" ItemsSource="{Binding nv_trans_t2k, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" IsSynchronizedWithCurrentItem="True" DataContext="{Binding Transactions}">
    2. <ListView.View>
    3. <GridView>
    4. <GridViewColumn Header="Kategorie" Width="120" DisplayMemberBinding="{Binding nv_category_t2k.bezeichnung}" />
    5. <GridViewColumn Header="Betrag" Width="50" DisplayMemberBinding="{Binding amount}" />
    6. </GridView>
    7. </ListView.View>
    8. </ListView>

    Kann man derlei Bindings nicht im PropertyFenster setzen?
    guggemol MVVM: "Binding-Picking" im Xaml-Editor - also vom Prinzip her sollte man sich Bindings an Properties einfach zurechtklicksen können.
    Allerdings bei Comboboxen als SpaltenTemplate bin ich unsicher, ob da Bindingpicking noch funzt.
    Also mit deinen Änderungen bringt er mir jetzt folgende Fehlermeldungen:

    System.Windows.Data Error: 40 : BindingExpression path error: 'nv_trans_t2k' property not found on 'object' ''MainModel' (HashCode=52218076)'.
    BindingExpression:Path=nv_trans_t2k; DataItem='MainModel' (HashCode=52218076); target element is 'ListView' (Name='lvw_kat'); target property is 'ItemsSource' (type 'IEnumerable')

    System.Windows.Data Warning: 54 : Collection of type 'System.Collections.Generic.HashSet`1[[HHHB2.trans_2_kat, HHHB2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'
    has been changed without raising a CollectionChanged event. Support for this is incomplete and inconsistent, and will be removed completely in a future version of WPF.
    Consider either (a) implementing INotifyCollectionChanged, or (b) avoiding changes to this type of collection.


    Das zusammenklicken im PropertyFenster klappt nicht wirklich ich sehe dort meine Propertys nicht zum reinklicken z.b:


    Interessanterweise gibt er auch den Datacontext immer als Mainmodel an obwohl er ja im Listview auf Transactions eingestellt ist.
    Das zusammenklicken würde nur dann funktionieren wenn ich direkt auf die ObservableCollection binde dann sehe ich die Properties das will ich aber nicht weil dafür hab ich ja die Listviewcollection.
    mfG.
    Stephan
    sehr eigentümlich. Weil DisplayMemberBinding="{Binding amount}" funzt, sagst du, also befindet sich das Bindungssystem in einem Context, wo eine Porpert amount vorhanden ist - das muss ja die trans_2k-Klasse sein.
    Ja, und die hat doch die Property nv_category_t2k - dann kann man da doch ebensogut dran binden. Und von dem category-Dingens kann man an die bezeichnung-Property binden.

    also ich keine Ahnung. vlt. hastes falsch einkopiert, weil vorher war 'Textblock' das target element inne Fehlermeldung, und nu ists auf einmal 'ListView'.
    Hab ich mir eigentlich auch gedacht trotzdem will es einfach nicht funktionieren.

    Ich hab jetzt nochmal den Code geändert:
    Ich hab jetzt dem Dockpanel in dem das Listview gekapselt ist den Datacontext angepasst:

    XML-Quellcode

    1. <DockPanel LastChildFill="True" DataContext="{Binding Transactions}">
    2. <ListView x:Name="lvw_kat" DockPanel.Dock="Top" Background="#FFF0F0F0" ItemsSource="{Binding nv_trans_t2k, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" IsSynchronizedWithCurrentItem="True">
    3. <ListView.View>
    4. <GridView>
    5. <GridViewColumn Header="Kategorie" Width="120" DisplayMemberBinding="{Binding nv_category_t2k.bezeichnung}" />
    6. <GridViewColumn Header="Betrag" Width="50" DisplayMemberBinding="{Binding amount}" />
    7. </GridView>
    8. </ListView.View>
    9. </ListView></DockPanel>

    Damit funktioniert es zwar noch immer nicht aber die Fehlermeldungen sind bis auf eine Weg:

    XML-Quellcode

    1. System.Windows.Data Warning: 54 : Collection of type 'System.Collections.Generic.HashSet`1[[HHHB2.trans_2_kat, HHHB2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'
    2. has been changed without raising a CollectionChanged event.
    3. Support for this is incomplete and inconsistent, and will be removed completely in a future version of WPF.
    4. Consider either (a) implementing INotifyCollectionChanged, or (b) avoiding changes to this type of collection.


    Kann es vielleicht an der Art und Weise liegen wie ich versuche eine Transaktion zu erzeugen?

    Hier mal die Sub aus dem Mainmodel:

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Neue Transaktion hinzufügen
    3. ''' </summary>
    4. ''' <param name="v_typ">Gibt an welcher Typ voreingestellt werden soll</param>
    5. Private Sub TransactionAdd(v_typ As String)
    6. Dim v_newitem1 As New transactions_v01
    7. Debug.Print(String.Concat("Aufruf Transaktion neu mit v_typ: ", v_typ))
    8. With v_newitem1
    9. .datum = CDate(Date.Now.ToShortDateString)
    10. If v_typ IsNot Nothing Then
    11. 'Der String Typ gibt an welche Art es ist "ein" "aus" oder "transfer" diese muss nun gesucht und die entsprechende ID zurückgegeben werden:
    12. Dim v_helper As Integer = Nothing
    13. v_helper = get_transtyp_from_string(v_typ)
    14. If Not v_helper = Nothing Then .transtyp_id = v_helper
    15. Else
    16. .transtyp_id = Nothing
    17. End If
    18. .konto_id = Nothing
    19. .receiver_id = Nothing
    20. End With
    21. 'Hier den Filter für die Buchungen auf aktive only stellen:
    22. Categories.Filter = New Predicate(Of Object)(AddressOf fil_category_main.AktivMainCategory_Filter)
    23. With Transactions
    24. .AddNewItem(v_newitem1)
    25. .MoveCurrentToLast()
    26. 'Dim v_dia As New dia_transaction_add_edit
    27. Dim v_dia As New dia_trans_add_edit
    28. With v_dia
    29. .Title = "Buchung hinzufügen"
    30. .ShowDialog()
    31. End With
    32. If v_dia.DialogResult Then
    33. .CommitNew()
    34. .MoveCurrentToLast()
    35. dbo.SaveChanges()
    36. Else
    37. .CancelNew()
    38. End If
    39. End With
    40. 'Filter zurückstellen:
    41. Categories.Filter = New Predicate(Of Object)(AddressOf fil_category_main.AllMainCategory_filter)
    42. End Sub

    Ich rufe also meinen Dialog auf und commite erst dann wenn ich ein positives Result erhalte gleichzeitig erfolgt erst danach das speichern in der DB.
    Es funktioniert zwar soweit das die Buchungen angelegt werden und auch die Trans_2_Kat angelegt werden aber vielleicht hackt es dort??
    mfG.
    Stephan
    deine Änderungen sollten keine Veränderung des Bindungsverhaltens bewirken - ist ja immer noch derselbe DataContext.

    Nur die Warnung ist jetzt ganz anders, nämlich sieht so aus, dass HashSet<T> als Datentyp nicht taugt als Navigations-Property. Wie biste ühaupt auf sowas komisches gekommen?


    Kann es vielleicht an der Art und Weise liegen wie ich versuche eine Transaktion zu erzeugen?
    ähm - Ist das so zu verstehen, dass bislang noch garkeine Transaktionene da sind zum Anzeigen?

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

    Also das HashSet<T> hat das Entity Framework selbst gebastelt das macht er bei allen NavigationProperties so....

    Es sind zwar schon Transaktionen in der Datenbank vorhanden aber der primäre Zweck des Dialogs ist es eine neue Transaktion zu erstellen die eben n Kategorien mit einem bestimmten Value zugeordnet sein können.
    Natürlich (siehe Code oben) erzeuge ich schon ein "leeres" Object vom Typ transaction_v01 und füge es bereits er Auflistung hinzu.
    mfG.
    Stephan
    also ich verstehe das jetzt so, dass der Code ganz irrelevant ist.

    Weil das Binding-Problem tritt ja bereits auf, wenn daten nur angezeigt werden sollen, also tritt auf, ohne dass der gezeigte Code überhaupt durchlaufen wurde.

    Und die Hashset-Warnung hat wohl auch nix damit zu tun, d.h., dein Binding-Problem ist eiglich gelöst.

    Evtl. wird halt eine Kategorie angezeigt, deren bezeichnung einfach leer ist?
    Ich habs gefunden ich "Dödel" hab einen Tippfehler gemacht in dem ich bei meinen Testdaten die ID einer Transaction als ID einer Kategorie vergeben habe daher konnte er klarerweise nix finden....
    mfG.
    Stephan

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

    Sry für Doppelpost aber ansonsten sieht man den neuen Beitrag nicht :/


    Leider hat sich jetzt noch ein Problem aufgetan:
    Zum Zuordnen einer Kategorie an eine Transaktion hab ich ein Relaycommand am laufen:

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Öffnet den Kategorie Such Dialog und gibt die gewählte Kategorie zurück
    3. ''' </summary>
    4. Private Sub TransactionKategorieSearch()
    5. '#TODO: Dezimaleingabe mit komma optimieren!
    6. Dim v_dia As New dia_search_kategorie
    7. With v_dia
    8. .WindowStartupLocation = WindowStartupLocation.CenterScreen
    9. .ShowDialog()
    10. If .DialogResult Then
    11. If .trv_kats.SelectedItem IsNot Nothing Then
    12. Dim v_cur_trans As transactions_v01 = CType(Transactions.CurrentItem, transactions_v01)
    13. Dim v_t2k As New trans_2_kat
    14. v_t2k.transaction_id = v_cur_trans.trans_id
    15. v_t2k.category_id = DirectCast(.trv_kats.SelectedItem, category_v01).cat_id
    16. If .txt_betrag.Text = "" Then
    17. v_t2k.amount = 0
    18. Else
    19. Dim v_betrag As Decimal = 0
    20. Try
    21. v_betrag = CDec(.txt_betrag.Text)
    22. Catch ex As Exception
    23. v_betrag = 0
    24. End Try
    25. v_t2k.amount = v_betrag
    26. End If
    27. v_cur_trans.nv_trans_t2k.Add(v_t2k)
    28. 'Aktuelle Gesamtsumme aktualisieren:
    29. v_cur_trans.totamount = v_cur_trans.nv_trans_t2k.Sum(Function(x) x.amount)
    30. End If
    31. End If
    32. End With
    33. End Sub



    Die Zuordnung sollte nun in der Collection gespeichert sein. Da meine Listview mit dem Item synchronisiert ist sollte die Änderung angezeigt werden => Tut es aber nicht
    Wenn ich nun den Reiter im Tabcontrol wechsle um quasi einen "Refresh" anzustoßen erhalte ich diese Meldung:
    An unhandled exception of type 'System.InvalidOperationException' occurred in PresentationFramework.dllAdditional information: Ein ItemsControl ist nicht konsistent mit seiner Elementquelle.
    Die Ausnahme wurde ausgelöst, da der Generator für Steuerelement 'System.Windows.Controls.ListView Items.Count:7' mit dem Namen 'lvw_kat' eine Reihe von CollectionChanged-Ereignissen empfangen hat, die nicht mit dem aktuellen Status der Elementauflistung übereinstimmen.
    Die folgenden Unterschiede wurden festgestellt:Gesammelte Anzahl 6 unterscheidet sich von der tatsächlichen Anzahl 7. [Gesammelte Anzahl ist (Anzahl bei letztem Reset + #Adds - #Removes seit letztem Reset).]


    PropertyChanged bzw. das INotify für die Klasse trans_2_kat ist implementiert??Einen Refresh auf die Transactions habe ich versucht darf ich aber nicht weil ich noch im AddNew bin und das CommitNew noch nicht gemacht wurde (das kommt ja später)
    mfG.
    Stephan
    Der Dialog bekommt keine Daten er besteht aus einem Treeview der an die ListColView Categories gebunden ist und einem Textfeld in das ein Betrag eingegeben wird dieses ist nicht gebunden. Die Rückgabe des Dialogs wird im MainModel in eine Entität trans_2_kat umgewandelt und an die aktuelle transaction in der ListColView über die Nav Property übergeben.

    Das hinzufügen von Dummi Daten funktioniert diese werden auch schön angezeigt wenn der Dialog aufgerufen wird:

    VB.NET-Quellcode

    1. Dim v_newitem1 As New transactions_v01
    2. With v_newitem1
    3. For i As Integer = 0 To 5
    4. Dim v_item As New trans_2_kat
    5. With v_item
    6. .amount = 123 + i
    7. .category_id = 1
    8. .transaction_id = v_newitem1.trans_id
    9. End With
    10. .nv_trans_t2k.Add(v_item)
    11. Next i
    12. End With


    Ich hab jetzt auch schon versucht mein Objekt direkt in die Entität unter Umgehung der NavigationProperty einzuspielen das klappt aber nicht weil die Transaction ja noch kein CommitNew hat und somit keine ID übergeben wird....
    mfG.
    Stephan
    Verstehe ich die Ausdrucksweise "Objekt in Entität einspielen" richtig, wenn ich verstehe, dass es generell misslingt, einem Item ein relational untergeordnetes Unter-Item zu adden?

    Was meinst du mit "Rückgabe des Dialogs"? Window.ShowDialog gibt doch nur True oder False zurück.

    Deine verlorenen Codezeilen sagen mir garnix. Bzw. doch, einem transactions_v01 werden 6 trans_2_kats zugefügt.

    kaifreeman schrieb:

    diese werden auch schön angezeigt wenn der Dialog aufgerufen wird:
    Und ohne Dialog werden sie nicht angezeigt?
    Eingangs zu deiner Frage:
    ​Verstehe ich die Ausdrucksweise "Objekt in Entität einspielen" richtig, wenn ich verstehe, dass es generell misslingt, einem Item ein relational untergeordnetes Unter-Item zu adden?

    Prinzipiell funktioniert es nur in diesem Fall kann es nicht funktionieren weil die trans2kat Entität über eine n:1 an die transactions_v01 Entität gebunden ist somit muss zwingend eine ID aus der Transactions_v01 vorhanden sein die aber zum Zeitpunkt des erstellens der Transaction 0 ist (also quasi ein Dummi). Die ID wird vom EF erst vergeben wenn der CommitNew ausgeführt wird was ich zu diesem Zeitpunkt aber nicht will weil der User ja seine Meinung ändern kann und das erstellen einer Transaction abbrechen könnte.

    Sry ich glaube ich habe mich etwas unverständlich ausgedrückt.

    Ich habe ein Relaycommand: TransactionAdd (vollständiger Code siehe unten im Spoiler) Diese Command wird aufgerufen erzeugt ein neues Object vom Typ transactions_v01 dort erstelle ich auch gleich meine Dummi Daten und diese werden sauber eingefügt.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub TransactionAdd(v_typ As String)
    2. Dim v_newitem1 As New transactions_v01
    3. Debug.Print(String.Concat("Aufruf Transaktion neu mit v_typ: ", v_typ))
    4. With v_newitem1
    5. .datum = CDate(Date.Now.ToShortDateString)
    6. If v_typ IsNot Nothing Then
    7. 'Der String Typ gibt an welche Art es ist "ein" "aus" oder "transfer" diese muss nun gesucht und die entsprechende ID zurückgegeben werden:
    8. Dim v_helper As Integer = Nothing
    9. v_helper = get_transtyp_from_string(v_typ)
    10. If Not v_helper = Nothing Then .transtyp_id = v_helper
    11. Else
    12. .transtyp_id = Nothing
    13. End If
    14. 'Vordefiniertes Konto setzen:
    15. If Konten.CurrentItem IsNot Nothing Then
    16. .konto_id = DirectCast(Konten.CurrentItem, konto_v01).kto_id
    17. Else
    18. .konto_id = Nothing
    19. End If
    20. .receiver_id = Nothing
    21. For i As Integer = 0 To 5
    22. Dim v_item As New trans_2_kat
    23. With v_item
    24. .amount = 123 + i
    25. .category_id = 1
    26. .transaction_id = v_newitem1.trans_id
    27. End With
    28. .nv_trans_t2k.Add(v_item)
    29. Next i
    30. End With
    31. 'Hier die Filter setzen so das nur aktive Elemente angezeigt werden
    32. Konten.Filter = New Predicate(Of Object)(AddressOf fil_konten.AktivKonten_Filter)
    33. Personen.Filter = New Predicate(Of Object)(AddressOf fil_personen.AktivPerson_Filter)
    34. Receivers.Filter = New Predicate(Of Object)(AddressOf fil_receiver.AktivReceiver_Filter)
    35. Transstati.Filter = New Predicate(Of Object)(AddressOf fil_transstati.AktivStatus_Filter)
    36. Categories.Filter = New Predicate(Of Object)(AddressOf fil_category_main.AktivMainCategory_Filter)
    37. With Transactions
    38. .AddNewItem(v_newitem1)
    39. .MoveCurrentToLast()
    40. 'Dim v_dia As New dia_transaction_add_edit
    41. Dim v_dia As New dia_trans_add_edit
    42. With v_dia
    43. .Title = "Buchung hinzufügen"
    44. .ShowDialog()
    45. End With
    46. If v_dia.DialogResult Then
    47. .CommitNew()
    48. .MoveCurrentToLast()
    49. dbo.SaveChanges()
    50. Else
    51. .CancelNew()
    52. End If
    53. End With
    54. 'Filter zurückstellen:
    55. Konten.Filter = Nothing
    56. Personen.Filter = Nothing
    57. Receivers.Filter = Nothing
    58. Transstati.Filter = Nothing
    59. Categories.Filter = New Predicate(Of Object)(AddressOf fil_category_main.AllMainCategory_filter)
    60. End Sub



    Innerhalb des Commands wird ein Dialog aufgerufen der die Propertys des aktuellen Items in der Transactions ListColView anzeigt (darum auch der Movelast)
    Der User kann nun innerhalb dieses Dialogs ein weiteres Command feuern:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub TransactionKategorieSearch()
    2. '#TODO: Dezimaleingabe mit komma optimieren!
    3. Dim v_dia As New dia_search_kategorie
    4. With v_dia
    5. .WindowStartupLocation = WindowStartupLocation.CenterScreen
    6. .ShowDialog()
    7. If .DialogResult Then
    8. If .trv_kats.SelectedItem IsNot Nothing Then
    9. Dim v_cur_trans As transactions_v01 = CType(Transactions.CurrentItem, transactions_v01)
    10. Dim v_t2k As New trans_2_kat
    11. v_t2k.transaction_id = v_cur_trans.trans_id
    12. v_t2k.category_id = DirectCast(.trv_kats.SelectedItem, category_v01).cat_id
    13. If .txt_betrag.Text = "" Then
    14. v_t2k.amount = 0
    15. Else
    16. Dim v_betrag As Decimal = 0
    17. Try
    18. v_betrag = CDec(.txt_betrag.Text)
    19. Catch ex As Exception
    20. v_betrag = 0
    21. End Try
    22. v_t2k.amount = v_betrag
    23. End If
    24. v_cur_trans.nv_trans_t2k.Add(v_t2k)
    25. 'Aktuelle Gesamtsumme aktualisieren:
    26. v_cur_trans.totamount = v_cur_trans.nv_trans_t2k.Sum(Function(x) x.amount)
    27. End If
    28. End If
    29. End With
    30. End Sub



    Dieses Command erzeugt wenn der Dialogresult True ist ein neues Objekt vom Typ trans2kat und fügt es an das aktuelle Item der Transactions ListColView über die Navigation Property nv_trans_t2k hinzu.
    Das alles funktioniert auch soweit aber es gibt 2 Probleme:
    1. Die im ersten Dialog gebundene Listview die an die Navigation Property gebunden ist wird nicht aktualisiert.
    2. (Das Listview liegt auf einem Tabcontrol) wenn ich das Tabcontrol wechsle kommt dann dieser Error wie im Beitrag zuvor beschrieben.

    Kann es sein das die Änderung der Navigationproperty die ja eine ICollection darstellt das INotifyPropertyChanged nicht richtig feuert? bzw. muss ich diese explizit nochmal mit einem INotifyPropertyChanged ausstatten (wenn ja dann wüsste ich nicht wie)
    mfG.
    Stephan
    hmm - keine Ahnung.

    in EntityFramework-CodeFirst-Sample gelingt es zumindest prinzipiell, über- und untergeordnete Entities zuzufügen.
    Allerdings spinnt der m:n-View beim Zufügen einer Category, das muss man im RawView machen.

    Dann aber kann man im m:n-View auch Category-Artikel - Zuordnungen adden, obwohl CatID dabei noch 0 ist.

    Drückt man dann Save, kriegt die neue Cat ihren richtigen Primkey.
    Wie meinst du das mit der RawView? Dein Beispiel habe ich mir schon angesehen das hilft mir in diesem Fall aber nur bedingt weiter.

    Ich hab gerade nochmal rumrecherchiert anscheinend gibt es da einen Bug das die NavigationPropertys nicht das INotifyPropertychanged feuern darum hab ich das jetzt getestet.

    VB.NET-Quellcode

    1. Partial Public Class transactions_v01
    2. Implements INotifyPropertyChanged
    3. Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    4. Protected Sub NotifyPropertyChanged(ByVal info As String)
    5. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
    6. Debug.Print("Raising Propertychanged: " & info)
    7. End Sub
    8. End Class
    9. Die Dummidaten feuern mir noch das Propertychanged ab aber wenn ich in der Sub routine: TransactionKategorieSearch
    10. [vbnet]​
    11. Dim v_cur_trans As transactions_v01 = CType(Transactions.CurrentItem, transactions_v01)
    12. 'v_t2k ist ein Item vom Typ trans_2_kat das eben befüllt ist
    13. v_cur_trans.nv_trans_t2k.Add(v_t2k)


    wird kein Propertychanged gefeuert das würde erklären warum die GUI ein Problem bekommt und asynchron wird weil sie ja von der Änderung nichts mitbekommen hat.
    Kann man da am PropertyChanged noch was machen?
    mfG.
    Stephan
    Achso das meinst du ja hab ich gesehen Programm schmiert ab wenn du im m:n eine Kategorie anlegen willst im Tab Rawitem funktioniert es.
    Eigentlich auch unerklärbar.

    Nochmal zur Frage vom Gefühl her liegt das ganze Problem an diesem Bug hier: connect.microsoft.com/VisualSt…the-propertychanged-event
    Es gibt hier auch einen möglichen Workaround, aber ich kann für die ICollection kein AssocitationChanged Event finden....

    VB.NET-Quellcode

    1. ​Public Overridable Property nv_trans_t2k As ICollection(Of trans_2_kat) = New HashSet(Of trans_2_kat)


    Gibt es eine Variante dieser Property ein INotifyPropertyChanged anzuhängen? bzw. diesen Workaround auszuführen?
    mfG.
    Stephan
    Es gibt zweierlei Arten Navi-Props: NaviProps zum Parent und NaviProps zu den Children.

    Du willst ja zu die Children. Dazu brauchst du kein PropertyChanged der NaviProp. Die ändert sich ja auch nicht - es ist ja dieselbe Children-Auflistung wie zuvor. Nur ein Item mehr ist drinne.

    Also ich würde eher zu untersuchen versuchen, warum meins geht.
    Warum dein Weg funktioniert ist mir klar du bindest nicht an die NavProp sondern an an die Observable Collections selbst, nur das hilft mir in dem Fall nicht.

    Ich brauche zur Darstellen der n:m Relation Daten aus 3 Tabellen:
    Transactions => die Transaktions ID
    Trans2Kat => die zugeordneten Kategorien und einen Wert Amount
    Categories => den Namen der Kategorie auf Basis der ID

    Mir fällt jetzt aber auch kein Weg ein wie ich an die Entität selber binden könnte ohne umständliche Filter... dafür gibt es ja meiner Meinung nach die NavProp die sollte mir ja meine zugeordneten Items geben :(
    Nur wenn die NavProp sich ja nicht ändert nur ein Item mehr ist warum krieg ich dann nen Error er müsste dann theoretisch doch die Listview einfach so updaten??
    mfG.
    Stephan