ObservableCollection(Of T) PropertyChanged Problem

  • WPF

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von hlghyr.

    ObservableCollection(Of T) PropertyChanged Problem

    Hallo Forum!
    Ich hab folgende Klasse erstellt.

    VB.NET-Quellcode

    1. Imports System.Collections.ObjectModel
    2. Public Class DreieckVM
    3. Inherits NotifyPropC
    4. Private _dreieck As New ObservableCollection(Of ElementeVM)
    5. Private _polygon As New PolygonVM
    6. Private _listePunkte As New List(Of Double)
    7. Public Sub New()
    8. Dreieck.Add(New ElementeVM("A", 70, 70, "Alpha", Nothing))
    9. Dreieck.Add(New ElementeVM("B", 270, 180, "Bata", Nothing))
    10. Dreieck.Add(New ElementeVM("C", 360, 130, "Gamma", Nothing))
    11. Dreieck.Item(1).PunktX = 45
    12. End Sub
    13. Public Property Dreieck() As ObservableCollection(Of ElementeVM)
    14. Get
    15. Return _dreieck
    16. End Get
    17. Set(ByVal value As ObservableCollection(Of ElementeVM))
    18. _dreieck = value
    19. NotifyPropertyChanged()
    20. End Set
    21. End Property
    22. Private Sub DreieckVM_PropertyChanged(sender As Object, e As ComponentModel.PropertyChangedEventArgs) Handles Me.PropertyChanged
    23. End Sub
    24. End Class


    Ich war immer der Meinung, das wenn sich Eigenschaftswerte ändern, das dies durch den Setter erfolgt. Wieso geht dann nicht bei Änderung der Eigenschaft einer ObservableCollection(Of T) dies durch den Setter. Hab ich eine falsche Konstruktion oder ist das immer so? Was muß ich tun, das es funktioniert.? Oder auch, was hab ich falsch gemacht?
    MfG hlghyr

    ErfinderDesRades schrieb:

    ist eigenartig. Üblicherweise muss man als String angeben, welche Property changed.
    Stimmt so nicht. Geht automatisch.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    @RushDen:: stimmt - die ganze Klasse geht so nicht auf.
    Im 3eckVM ist eine Property 3eck, aber das ist kein 3eck sondern eine Auflistung von ElementeVM, und die Property ist ReadWrite, also man kann das 3eck aussm 3eckVM weghauen, indem man eine neue Auflistung zuweist - 8|

    @thefiloe:: echt - ist das neu in 2012? Weil früher musste man immer. Es gab paar Spezialisten, die haben sich eine VM-Basis-Klasse gecodet, die das iwie anners gehandelt hat, aber das war immer enorm aufwändig, und auch schauerlich lahm.
    Also um das zu klären bräuchten wir genauere Infos über die Basisklasse.
    EDR!
    Ist ganz Praktisch, kann man keine Fehler machen.

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Imports System.Runtime.CompilerServices
    3. Public Class NotifyPropC
    4. Implements INotifyPropertyChanged
    5. Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
    6. Public Sub NotifyPropertyChanged(<CallerMemberName()> Optional ByVal propertyName As String = Nothing)
    7. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
    8. End Sub
    9. End Class


    RushDen!
    In der Sub New mach ich das ja aber nicht einmal da geht er durch den Setter. Die Methode "Private Sub DreieckVM_PropertyChanged(se..." funktioniert jedenfalls.
    Hatte "NotifyPropertyChanged()" mal in den Getter mit einer MSB in der Methode getan. Kann dir sagen, war nicht lustig. Konnte das Programm und das VS nicht mehr beenden. Schöne Erfahrung.

    MfG hlghyr
    RushDen!
    Also, ich benutze die Datei "NotifyPropC" schon eine ganze Weile. Gab nie Probleme und hat alles funktioniert. Mit deinen 2. Absatz komme ich nicht ganz klar. Das ist ein Item für die OC(of T).
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Public Class ElementeVM
    3. Inherits NotifyPropC
    4. Private _punktX As Double
    5. Private _punktY As Double
    6. Private _winkel As Double
    7. Public Property NameWinkel() As String
    8. Public Property NamePunkt() As String
    9. Public Sub New()
    10. End Sub
    11. Sub New(p1 As String, p2 As Double, p3 As Double, p4 As String, p5 As Double)
    12. NamePunkt = p1
    13. NameWinkel = p4
    14. Winkel = p5
    15. PunktX = p2
    16. PunktY = p3
    17. End Sub
    18. Public Property PunktY() As Double
    19. Get
    20. Return _punktY
    21. End Get
    22. Set(ByVal value As Double)
    23. _punktY = value
    24. NotifyPropertyChanged()
    25. End Set
    26. End Property
    27. Public Property PunktX() As Double
    28. Get
    29. Return _punktX
    30. End Get
    31. Set(ByVal value As Double)
    32. _punktX = value
    33. NotifyPropertyChanged()
    34. End Set
    35. End Property
    36. Public Property Winkel() As Double
    37. Get
    38. Return _winkel
    39. End Get
    40. Set(ByVal value As Double)
    41. _winkel = value
    42. NotifyPropertyChanged()
    43. End Set
    44. End Property
    45. End Class


    EDR!
    Das ist mir auch schon durch den Kopf gegangen. Aber ich dachte, wenn in der OC(Of T) sich ein Wert ändert, Das ja dann schreibend auf die OC zugegriffen wird. Ich denke auch, das ich was mit den Konstruktoren falsch gemacht habe. Dachte auch schon daran, die geänderten Items durch ein Property zu geben. Aber da das auch nur Änderungen sind, dürfte ich wohl das selbe Problem haben.

    MfG hlghyr