Aufrufendes ViewModel ermitteln

  • WPF MVVM
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von kafffee.

    Aufrufendes ViewModel ermitteln

    Hallo miteinander :)

    Ich hab ein mittelschweres Problem, wo ich nicht sicher weiter weiss:

    Und zwar habe ich zwei Arten ViewModels:

    SingleEffectRackViewModel und IntrumentenRackViewModel

    Davon gibt es jeweils 5 Instanzen.

    In allen hat man die Möglichkeit, das UI von VST-PlugIns zu öffnen in extra Fenstern. Diese Fenster sind vom Typ PlugInWindow und haben den DataContext LeeresViewModel.

    Geöffnet bzw. aufgerufen werden diese so:

    VB.NET-Quellcode

    1. LeeresVM = New ViewModel.LeeresViewModel(WelcherKanal & "(" & CStr(index + 1) & "): " & vstInfo.effectName, AngewendeteEffekte(index).Handle, AngewendeteEffekte(index), Me) 'hier möchte ich als letztes Argument das aufrufende ViewModel übergeben, dieses kann aber zwei verschiedene Typen haben
    2. FensterService.OeffnePlugInFenster(WelcherKanal & ": " & vstInfo.effectName, vstInfo.editorHeight + 28, vstInfo.editorWidth, LeeresVM, Me)


    Nun muss ich beim Schliessen der Fenster für die PlugIns, welches von LeeresViewModel aus geschehen soll, eine Property UIOffen As Boolean im aufrufenden ViewModel aktualisieren, damit das aufrufende ViewModel weiss, dass das Fenster wieder zu ist:

    VB.NET-Quellcode

    1. Private Sub SchliessePlugInFenster_Execute(obj As Object)
    2. BassVst.BASS_VST_EmbedEditor(EffektKanal, Nothing)
    3. Dim index As Integer = MainModule.LayerVM.VSTsViewModel.DeckLeftEffects.AngewendeteEffekte.ToList.FindIndex(Function(x) x.ID = Effekt.ID)
    4. If index <> -1 Then
    5. MainModule.LayerVM.VSTsViewModel.DeckLeftEffects.AngewendeteEffekte(index).UIOffen = False
    6. End If
    7. FensterService.SchliessePlugInFenster(Me, UIHandles)
    8. End Sub


    In dem Beispiel hier habe ich das so gelöst, aber ich will anstatt dem "festen" MainModule.LayerVM.VSTsViewModel.DeckLeftEffects.AngewendeteEffekte das übergebene VM hernehmen.

    Das Problem ist: Man könnte dieses ja im Konstruktor von LeeresVM als ByRef übergeben, aber wie geht es dann weiter? Ich muss ja nicht vom Konstruktor aus darauf zugreifen, sondern von SchliessePlugInFenster_Execute Es können ja auch zwei Typen VM sein, also InstrumentenRackViewModel und Single EffectRackViewModel...

    Ich hoffe ich hab das Problem verständlich geschildert und freue mich auf Eure Antworten :)
    Super, hab jetzt das aufrufende als Object mitgegeben und beim Schliessen des PlugInFensters das hier:

    VB.NET-Quellcode

    1. Private Sub SchliessePlugInFenster_Execute(obj As Object)
    2. BassVst.BASS_VST_EmbedEditor(EffektKanal, Nothing)
    3. Dim index As Integer
    4. If TryCast(AufrufendesVM, ViewModel.InstrumentenRackViewModel) Is Nothing Then
    5. index = DirectCast(AufrufendesVM, ViewModel.SingleEffectRackViewModel).AngewendeteEffekte.ToList.FindIndex(Function(x) x.ID = Effekt.ID)
    6. If index <> -1 Then
    7. DirectCast(AufrufendesVM, ViewModel.SingleEffectRackViewModel).AngewendeteEffekte(index).UIOffen = False
    8. End If
    9. Else
    10. DirectCast(AufrufendesVM, ViewModel.InstrumentenRackViewModel).UIOffen = False
    11. End If
    12. FensterService.SchliessePlugInFenster(Me, UIHandles)
    13. End Sub


    Scheint erstmal zu funktionieren. Danke für die Tipps!
    puh - wie kriegst du es nur immer hin mir Augenweh zu erzeugen? Probierma

    VB.NET-Quellcode

    1. Private Sub SchliessePlugInFenster_Execute(obj As Object)
    2. BassVst.BASS_VST_EmbedEditor(EffektKanal, Nothing)
    3. Dim irvm = TryCast(AufrufendesVM, ViewModel.InstrumentenRackViewModel)
    4. If irvm IsNot Nothing Then
    5. irvm.UIOffen = False
    6. Else
    7. Dim servm = DirectCast(AufrufendesVM, ViewModel.SingleEffectRackViewModel)
    8. Dim ae = servm.AngewendeteEffekte.FirstOrDefault(Function(x) x.ID = Effekt.ID)
    9. If ae IsNot Nothing Then ae.UIOffen = False
    10. End If
    11. FensterService.SchliessePlugInFenster(Me, UIHandles)
    12. End Sub