Einzelnen Beitrag anzeigen

Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

MVVM - ViewModel 1:n Beziehung

  Alt 23. Nov 2016, 13:15
Hallo,

Ich hoffe einfach darauf dass es hier jmd. gibt der mir helfen kann.
Bin was MVVM angeht kompletter Neuling und bin mir momentan nicht sicher wie man folgendes richtig lösen würde:

Mein Fenster soll mehrere Dokumente darstellen können (1 Doc pro Tabsheet). Jedes dieser Dokumente enthält mehrere Elemente.
Das ganze soll nun in MVVM abgebildet werden. Mein Ansatz war bisher folgender:

Mein Fenster:
Code:
<Window ...>
    <Grid>
        <views:DocumentView/>
    </Grid>
</Window>
DocumentViewModel:
Code:
public class DocumentViewModel
{
    public ObservableCollection<DocumentModel> Documents
    {
        get; private set;
    }
   
    public DocumentViewModel()
    {
        Documents= new ObservableCollection<DocumentModel>();
    }
}
DocumentModel:
Code:
public class DocumentModel : DependencyObject
{
    public static readonly DependencyProperty TitleProperty = DependencyProperty.Register("Title", typeof(string), typeof(DocumentModel), new PropertyMetadata("Untitled"));
    public static readonly DependencyProperty FilenameProperty = DependencyProperty.Register("Filename", typeof(string), typeof(DocumentModel), new PropertyMetadata(""));
   
    public string Title
    {
        get { return (string)GetValue(TitleProperty); }
        set { SetValue(TitleProperty, value); }
    }

    public string Filename
    {
        get { return (string)GetValue(FilenameProperty); }
        set { SetValue(FilenameProperty, value); }
    }
}
DocumentView:
Die DocumentView stellt die Liste von Dokumenten aus dem ViewModel in einem PageControl dar.
Ich nutze Avalondock, vereinfache das XAML hier aber zu einem Pseudo-PageControl um das ganze übersichtlich zu halten.
Der Inhalt der Document-Tabsheets wird mit DocumentElementViews dargestellt.
Code:
<UserControl>
    <UserControl.DataContext>
        <viewModels:DocumentViewModel/>
    </UserControl.DataContext>

    <UserControl.Resources>
        <DataTemplate DataType="{x:Type viewModels:DocumentElementViewModel}">
            <views:DocumentElementView/>
        </DataTemplate>
    </UserControl.Resources>

    <PageControl DocumentSource="{Binding Documents}">
        <PageControl.TabHeaderTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Title}"/>
            </DataTemplate>
        <PageControl.TabHeaderTemplate>

        <PageControl.TabContentTemplate>
            <DataTemplate>
                <ContentControl>
                    <ContentControl.Content>
                        <viewModels:DocumentElementViewModel/> <!-- PROBLEM! -->
                    </ContentControl.Content>
                </ContentControl>
            </DataTemplate>
        </PageControl.TabContentTemplate>
    </PageControl>
</UserControl>
Wo ich jetzt nicht genau weiß was ich tun soll ist in der mit "<!-- PROBLEM! -->" markierten Zeile.
Das DocumentElementViewModel muss die Elemente des Documents aus der Datei laden und benötigt dafür den Dateinamen.
Wie kann ich jetzt den Dateinamen an das DocumentElementViewModel weitergeben? Ich kann dem DocumentElementViewModel natürlich eine Property "DocumentFilename" verpassen und dann
im XAML in der markierten Zeile folgendes tun:
Code:
<viewModels:DocumentElementViewModel DocumentFilename="{Binding Filename}"/>
Aber ist das der richtige Weg? Gehört der DocumentFilename in das viewModelsocumentElementViewModel obwohl es ja schon im DocumentModel enthalten ist?
Ich müsste das Laden der Elemente dann im PropertyChanged von DocumentFilename anstoßen.

Nachdem ich mich im Internet etwas umgeschaut hat sollte man allerdings seine ViewModels miteinenader verbinden.
Also soll ich im DocumentViewModel die Liste mit DocumentModels durch eine mit DocumentElementViewModel ersetzen? Aber dann bräuchte DocumentElementViewModel doch eine Property mit dem DocumentModel. Und dann ist irgendwie alles komisch verschoben.

Ich hoffe das ist nicht zu verwirrend. Ich bin nämlich verwirrt und weiß nicht genau wie ich so eine 1:n Beziehung zwischen 2 ViewModels (+ Views/Models) und die Datenübergabe vom ViewModel-Parent zu den n-ViewModel Kindern sauber im Sinne des MVVM-Patterns hinbekomme.

Ich bekomme das schon irgendwie hin, aber bei allem was ich mir überlege habe ich das Gefühl, dass es keine Lösung im Sinne des MVVM-Patterns ist.
Deshalb würde mich eine generelle Vorgehensweise interessieren.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (23. Nov 2016 um 13:17 Uhr)
  Mit Zitat antworten Zitat