Übergeben von Daten an Untergeordnete Fenster in Silverlight 4 mit MVVM
Ich habe ein datagrid mit master-detail-Implementierung wie folgt:
<data:DataGrid x:Name="dgData" Width="600" ItemsSource="{Binding Path=ItemCollection}"
HorizontalScrollBarVisibility="Hidden" CanUserSortColumns="False" RowDetailsVisibilityChanged="dgData_RowDetailsVisibilityChanged">
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="Item" Width="*" Binding="{Binding Item,Mode=TwoWay}"/>
<data:DataGridTextColumn Header="Company" Width="*" Binding="{Binding Company,Mode=TwoWay}"/>
</data:DataGrid.Columns>
<data:DataGrid.RowDetailsTemplate>
<DataTemplate>
<data:DataGrid x:Name="dgrdRowDetail" Width="400" AutoGenerateColumns="False" HorizontalAlignment="Center"
HorizontalScrollBarVisibility="Hidden" Grid.Row="1">
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="Date" Width="*" Binding="{Binding Date,Mode=TwoWay}"/>
<data:DataGridTextColumn Header="Price" Width="*" Binding="{Binding Price, Mode=TwoWay}"/>
<data:DataGridTemplateColumn>
<data:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="Show More Details" Click="buttonShowDetail_Click"></Button>
</DataTemplate>
</data:DataGridTemplateColumn.CellTemplate>
</data:DataGridTemplateColumn>
</data:DataGrid.Columns>
</data:DataGrid>
</DataTemplate>
</data:DataGrid.RowDetailsTemplate>
</data:DataGrid>
Möchte ich öffnen Sie ein Kind-Fenster bei Klick auf die Schaltfläche, die zeigt mehr Informationen über das Produkt.
Ich bin mit MVVM-Muster. Mein Modell enthält eine Methode, bei der der name des Gegenstands als Eingabe und gibt die Details der Daten.
Mein problem ist, wie soll ich übergeben Sie das Element, um ViewModel, das die Details der Daten vom Modell? Und wo sollte ich öffnen Sie die neue Untergeordnete Fenster? In der View oder ViewModel?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Öffnen die child-Fenster aus einen Blick Modell verstößt gegen die Trennung zwischen view und view-Modell, dass das Muster sollte alles über sein. Also, hast du wahrscheinlich nicht viel Auswahl über, wo Sie öffnen die child-Fenster von - der code hinter der Seite, auf der das Gitter auf. (Und das verstößt gegen das Muster auch, aber kurz eine komplizierte Lösung, es ist alles, was, die Sie tun können.) Ich benutze das MVVM-Muster, aber ich bin nicht "religiös" über es. Ich werde gegen einige Prinzipien der Muster, wenn Effizienz diktiert.
So weit wie die übergabe der Sache an die ViewModel - ich nehme an, Sie können erstellen Sie eine property im ViewModel darstellt, eine id für das Element. Ich habe mit child-windows als Formulare für die Dateneingabe für die Aktualisierung und hinzufügen. Ich Neige zu erstellen, die ein ViewModel für jeden von Ihnen. In Ihrem Fall müssten Sie ein ViewModel darstellt, die details der Artikel. Es wäre eine Art von ID auf das Produkt bezogen und details. Das wäre eine öffentliche Eigenschaft im ViewModel. Sie könnte erstellen Sie einen Konstruktor für das untergeordnete Fenster, das nimmt die ID als parameter. Dann die Kind-Fenster-Konstruktor erstellen könnte das ViewModel und senden der ID.
Etwas wie dieses - wo DomainEdit ist der name des untergeordneten Fensters.
Dann aus dem code hinter denen der Schaltfläche klicken Sie für die grid-Auftritt, erstellen Sie das untergeordnete Fenster mit dem neuen Konstruktor die id, die Sie von der Sache, verbindlich in der Rasterzeile, und eine unabhängige Meinung zu Modell für das untergeordnete Fenster übernimmt.
Mindestens, das ist, was die Arbeit für mich.
Dem mediator pattern (messaging-service zwischen den Ansichten in Bezug auf unsere composite application) macht den job. Darüber hinaus delegieren die Erstellung der Detail-Ansicht in ein Untergeordnetes Fenster, service und übergeben Sie das ausgewählte Objekt über den messaging-Dienst. Dann werden Sie nicht bekommen, eine Muster-Verletzung.