Zwei ähnliche Methoden zusammenfassen?

  • WPF

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Ich nutze in meinem Projekt auch einen Serializer. Und ich habe nur die Klasse Members, die wiederum eine Collection von NLSMember, und eine weitergehende Klasse kapselt. Diese wird serialisiert. Das Ergebnis ist, dass ich tatsächlich drei Objekte habe, nämlich "Members", Array von NLSMembers und das dritte Objekt, welche jedoch in der Serialisierung eine Abhängigkeit voneinander aufweisen. Wenn ich dies wieder deserialisiere, erhalte ich wieder als Stammklasse die Klasse Members, in welcher die Collection von NLSMember und das dritte Objekt enthalten ist. Ich habe in Summe genau die Objekte, die ich vorher geschaffen habe und keine Klone der untergebenen Klassen
    Es gibt IMHO mehrere herangehensweisen welche ich gerne unterschiedlich nutze - je nachdem wie ich sie benötige.

    Möchte ich ein Objekt unabhängig ändern können arbeite ich nur mit IDs.

    Beispiel:
    Objekt "Person" (Vorname, Nachname, ....)
    Objekt "User" (UserName, Ref. zu Person)

    In diesem Fall will ich nicht die Person direkt im User haben, und da setze ich lediglich eine Referenz.

    Somit bekommt das Objekt User eine Eigenschaft PersonID (GUID).
    Ich habe dann zwei Files. 1x persons.xml und 1x user.xml.

    In der Person.xml sind alle Personen. In der User.xml sind alle User und deren PersonID. Anhand dieser hole ich mir dann die Personendaten aus der PErson.xml. Fertich.

    Und hier ist es dann wieder von Vorteil wenn ich aus meinem Model nicht auch gleich ein ViewModel mache sondern ein eigenes ViewModel, dort kann ich nun wieder das Objekt selbst als eigenschaft haben da ich es im Konstruktor ja wieder easy befüllen kann.

    Grüße
    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. ##

    Jetzt muss ich das Thema aus gegebenem Anlass nochmal aufgreifen. Ich habe jetzt das hier:

    VB.NET-Quellcode

    1. Private _Playlist1 As ObservableCollection(Of Model.MP3FileInfo)
    2. Private _Playlist2 As ObservableCollection(Of Model.MP3FileInfo)
    3. Private _Playlists() As ObservableCollection(Of Model.MP3FileInfo) = {_Playlist, _Playlist2}
    4. Public Property Playlists() As ObservableCollection(Of Model.MP3FileInfo)
    5. Get
    6. Return _Playlist
    7. End Get
    8. Set(value As ObservableCollection(Of Model.MP3FileInfo))
    9. _Playlist = value
    10. RaisePropertyChanged()
    11. End Set
    12. End Property


    Aber wie lege ich in der Property fest, ob Playlist 1 oder 2 gegettet/gesettet werden soll und ist das Überhaupt machbar, eine Property als Array? Einfach zwei Properties schreiben, so à la:

    VB.NET-Quellcode

    1. Public Property(0) As ObservableCollection(Of Model.MP3FileInfo)
    2. Get
    3. Return _Playlist1
    4. [...]
    5. End Property
    6. Public Property(1) As ObservableCollection(Of Model.MP3FileInfo)
    7. Get
    8. Return _Playlist2
    9. [...]
    10. End Property



    Und wie könnte das Binding dann aussehen?

    Etwa so?

    <DataGrid ItemsSource="{Binding Playlists(0)}"/>

    und

    <DataGrid ItemsSource="{Binding Playlists(1)}"/>
    @ErfinderDesRades

    Yep kompilieren tuts nicht. War mehr so als Pseudocode gedacht dass man weiss worauf ich hinaus will...

    Also pass auf:

    Ich hab in meinem Programm quasi zwei Player drin, deren Ausgangssignal man dann mischen kann. So ähnlich wie ein DJ mit seinen Plattentellern... Damit ich nicht für jeden "Plattenteller" dieselben Methoden immer zweimal schreiben muss möchte ich die Methoden usw. zusammenlegen und bestimmte Variablen, Properties usw. ganz einfach über Indexe ansprechen. Das geht ja nun mit "normalen Variablen" ( _Playlist1 , _Playlist2 , diese dann zusammengefasst im Array Playlists() ) problemlos. Aber wie ist es mit einer Property? So wie ich das hier in meinem Code hab geht das wie du sagtest, natürlich nicht... Auch das mit dem Binding wird wahrscheinlich schwierig: ItemsSource="{Binding Playlists(0)}"

    Also was/wie dann? Hast du eine Idee?

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

    Das mit dem Binding und den Propertys geht schon. Du musst eben nur für beide jeweils etwas bereitstellen - allerdings einfach als normale Propertys:

    VB.NET-Quellcode

    1. Private PlayList1Value As ObservableCollection(Of Model.MP3FileInfo)
    2. Private PlayList2Value As ObservableCollection(Of Model.MP3FileInfo)
    3. Public Property PlayList1() As ObservableCollection(Of Model.MP3FileInfo)
    4. Get
    5. Return PlayList1Value
    6. End Get
    7. Set(ByVal value As ObservableCollection(Of Model.MP3FileInfo))
    8. PlayList2Value = value
    9. End Set
    10. End Property
    11. Public Property PlayList2() As ObservableCollection(Of Model.MP3FileInfo)
    12. Get
    13. Return PlayList2Value
    14. End Get
    15. Set(ByVal value As ObservableCollection(Of Model.MP3FileInfo))
    16. PlayList2Value = value
    17. End Set
    18. End Property
    19. 'Und du könntest außerdem nun auch beide kombiniert zurückgeben, wenn gewollt:
    20. Public Property PlayList2() As ObservableCollection(Of Model.MP3FileInfo)
    21. Get
    22. Return CombinedPlaylists()
    23. End Get
    24. End Property
    25. Function CombinedPlaylists As ObservableCollection(Of Model.MP3FileInfo)
    26. 'Hier fügst du die beiden dann zusammen oder gibst sie einfach beide in einem Array zurück, je nach Belieben
    27. End Function


    So hättest du alle Möglichkeiten

    und dann kannst du auch mittels Binding an entweder Playlist1, Playlist2 oder CombinedPlaylists binden.


    BTW: Bei dir steht ja immer "As ObservableCollection(Of Model.MP3FileInfo)".
    Ich mache das immer so, dass ich eine Klasse nehme, die von dem besagten abgeleitet wird

    VB.NET-Quellcode

    1. Class MP3FileInfoCollection inherits ObservableCollection(Of Model.MP3FileInfo)
    2. End Class


    Dann kannst du deine Ausdrücke nämlich auch vereinfachen:

    VB.NET-Quellcode

    1. Private PlayList1Value As MP3FileInfoCollection
    2. Private PlayList2Value As MP3FileInfoCollection


    Ich find es irgendwie schöner, wenn nicht immer die ganzen generischen Typen mit angehangen werden. Aber das ist - glaube ich - eher Geschmackssache

    EDIT: Optional, und das war glaub ich, dein Plan: Du kannst auch eine Property als Array definieren, in der beide Collections enthalten sind und diese generell an dein Vorhaben binden. Müsstest dann jedoch mittels Parameter oder anderer Property steuern, auf welche zugegriffen wird