ObservableCollection von anderem ViewModel bekommen?

  • WPF

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von xChRoNiKx.

    ObservableCollection von anderem ViewModel bekommen?

    Hallo,

    entweder hab ich gerade einen Design fehler oder aber ich komm nicht drauf.

    Ich habe ein TabControl. In diesem sind TabPages. Jede TabPage hat ein eigenes ViewModel.
    Nun habe ich aber auch ein MainWindowVM in der ich so generelle dinge speicher.

    In jeder TabPage gibt es eine ObservableCollection für Daten die ich später in eine CSV/Excel schreibe.
    Nun habe ich in meinem MainWindow halt ein paar Selectboxen für jede TabPage und einen Button mit "Export alle selektierten nach Excel".

    Jetzt hapert es aber daran wie ich denn an die Daten komme der andere ViewModels?
    Ich muss ja jetzt im MainWindowVM (dort ist der Button an einen Command gebunden) ja irgendwie die ObservableCollections der anderen ViewModels bekommen um diese zu speichern.

    Wie mache ich das? Ist das überhaupt ein Sinnvoller Ansatz? Hab ich einen DesignFehler?
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Hi,

    ja das dachte ich auch schon aber wie bekomme ich die Instanz des ViewModels von der TabPage?
    Ich lege ja per XAML alles fest also ich leg da den Datenkontext nicht per Code fest.

    /EDIT//
    Also ich weiß wie ich den DataContext bekomme im CodeBehind, da kann ich ja auf die Controls zugreifen.
    Aber in meinem MainWindowVM kann ich ja nicht auf die Controls zugreifen.
    Daher die Frage wie ich vom VM auf die Controls zugreifen kann.

    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

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

    Bei mir laufen alle Viewmodels im MainViewmodel zusammen.
    Die Wurzel meines MainViewmodels ist ein Public Singleton - also wenn alle Stricke reissen, kann von überall im Code nach überall hin gegrabscht werden.

    xChRoNiKx schrieb:

    In jeder TabPage gibt es eine ObservableCollection
    das verstehe ich nicht.ObservableCollections sind doch nicht im View, oder?

    Ich benutze übrigens auch keine Tabpages.
    Sondern ich bastel eine Collection(Of Object) mit allen möglichen Viewmodels drinne, und binde die ItemSource des TabControls daran. Zusätzlich für jedes Viewmodel bastel ich ein UserControl und einen Style, der das UC aufs VM mappt.
    guggemol Grundlagen - MVVM-Anwendungs-Struktur

    (Ach mist - grade geguckt: da habichs grad nicht so gemacht wie hier beschrieben)

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

    Hi,

    danke für die Antwort.
    @MichaHo
    Also ich würde ungerne alle Collections im MainViewModel haben da für diese auch echt ne lange Logik verantwortlich ist diese zu füllen.

    @ErfinderDesRades ja du hast natürlich Recht. Das war etwas "merkwürdig" ausgedrückt. Natürlich hat jedes ViewModel eine ObservableCollection nicht die View.
    Die Idee mit der Collection für die ViewModels und das TabControl ist an sich ja eine gute aber ich habe genau 7 feste Tabs die sich nicht ändern.

    Ich werde aber einfach dann die Idee aufschnappen und alle ViewModels im MainViewModel packen das klingt erstmal nach einer guten Lösung für mich.
    Für mich wäre dann erstmal das Thema soweit gelöst.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

    xChRoNiKx schrieb:

    Die Idee mit der Collection für die ViewModels und das TabControl ist an sich ja eine gute aber ich habe genau 7 feste Tabs die sich nicht ändern.

    So ein Tab ist doch schnell umgebastelt in ein UserControl.
    Und wenn du deine MainViewModellist dann hast, dann ist dein VM damit doch auch vollständig untereinander vernetzt.

    Ich muss das selbst nochmal nachgucken - glaub man brauchte nichtmal einen Style - ein korrekt gebasteltes UserControl beinhaltet ja den VM-Typ, der auf es anzuwenden ist.
    Moin,

    um das hier nochmal aufzugreifen.. Der Vorschlag mit der Collection war doch viel besser als gedacht.
    Da ich natürlich in jedem ViewModel auch mehr oder minder die gleichen Methoden habe um Reports zu generieren
    habe ich mir ein IViewModel als Base gebastelt mit all den gleichen propertys und Methoden um dann mit einer Schleife durch die Collection<IViewModel>
    zu gehen um alle Methoden aufzurufen.

    Spart ne Menge code. Danke dafür @ErfinderDesRades ja und damit war dann natürlich das ding mit dem zugreifen auch gelöst da ich ja jetzt jede VM im MainVM drin habe.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

    xChRoNiKx schrieb:

    IViewModel als Base gebastelt
    Die Benamung ist ganz daneben. Der I-Prefix ist absolut ausnahmslos für Interfaces reserviert. Wenn du eine Base-Klasse gemacht hast, dann soll sie ViewmodelBase heissen.
    Wenn du hingegen wirklich ein Interface gemacht hast, wird das sicherlich keinen Code sparen - weil jeder Interface-Member wäre dann ja in jeder es implementierenden Viewmodel-Klasse neu auszuprogrammieren.
    Ist ein interface es ging bei dem Code sparen darum das ich jetzt nicht 7 code Blöcke habe die genau das gleiche machen aber immer genau die eine Methode pro view model aufrufen. Und da ich per interface ja sagen kann hier die Methode ist überall drin kann ich durch die collection gehen und immer wieder die Methode aufrufen. Anstatt also 7 mal den gleichen Code hab ich nun nur noch eine Schleife.

    Also ja es ist ein interface keine baseclass.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen