2016-10-12 8 views
2

Ich habe eine einfache WPF-Anwendung wie folgt:WPF/MVVM eine Ansicht Laden zur Laufzeit dynamisch

enter image description here

Ich habe auch 3 verschiedene Ansichten:

  • DetailType1.xaml
  • DetailType2 .xaml
  • DetailType3.xaml

und jede Ansicht hat seine eigene Ansichtsmodell

ParentView.xaml

... 
<!-- Detail Area --> 
<GroupBox x:Name="groupDetails" Grid.Column="0" Header="Details" 
         HorizontalAlignment="Stretch" 
         Grid.Row="0" VerticalAlignment="Stretch"> 
    <GroupBox.Resources> 
     <ResourceDictionary> 
      <DataTemplate DataType="{x:Type vm:DetailType1ViewModel}"> 
        <views:DetailType1View/> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type vm:DetailType2ViewModel}"> 
        <views:DetailType2View/> 
      </DataTemplate> 
     </ResourceDictionary> 
    </GroupBox.Resources> 
    <ContentPresenter DataContext="{Binding}" Content="{Binding Path=BaseTypeViewModel}" /> 
</GroupBox> 
... 

ParentViewModel.cs

... 
public BaseViewModel BaseTypeViewModel 
{ 
    get { return GetValue<BaseViewModel>(); } 
    set 
    { 
     SetValue(value); 
    } 
} 

private void ShowDetailDialog() 
{ 
    var vm = GetViewModelByID(SelectedID); 
    BaseTypeViewModel = vm; 
} 

private BaseViewModel GetViewModelByID(int Id) 
{ 
    switch (Id) 
    { 
     case 1: 
      return IoC.Get<DetailType1ViewModel>(); 
     case 2: 
      return IoC.Get<DetailType2ViewModel>(); 
    } 
} 
... 

DetailType1ViewModel.cs

public class DetailType1ViewModel : BaseViewModel 
{ 
    ... 
} 

Meine Frage ist:

Jedes Mal, wenn ich im linken Bereich auf DataGrid-Zeile doppelklicke, möchte ich eine der oben genannten Ansichten in den Detailbereich laden, abhängig von der ausgewählten ID. Also, welche Techniken können verwendet werden? Es wäre schön, wenn Sie mir ein Codebeispiel zeigen könnten.

Vielen Dank an alle für die Hilfe.

+0

Verwenden Sie eine '' und laden Sie Ihre Seiten darin – Alex

Antwort

2
  1. erstellen <DataTemplate> innerhalb eines <ResourceDictionary> für jede Ansichtsmodell, die Sie (mit der korrekten DataType={x:Type local:DetailTypeViewModelX}) im Detailbereich angezeigt werden soll.
  2. Stellen Sie sicher, dass <ResourceDictionary> mit einem Vorgänger des Detailbereichs zusammengeführt wird. Ein möglicher Ort wäre <Application.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="..." />.
  3. Binden Sie die DataContext des Detailbereichs an die Instanz des ViewModel, die Sie anzeigen möchten.
  4. erstellen <ContentPresenter Content="{Binding}" /> im Bereich Details in dem Sie den Inhalt des <DataTemplate> aus Schritt 1.

Dies sollte funktionieren und folgen Sie dem Gesamtkonzept der MVVM angezeigt werden soll.

+0

In Schritt 3 meinen Sie, ich muss eine DataContext-Eigenschaft in jeder Detailansicht deklarieren? –

+1

@QuanNguyen Nein. Sie haben ** einen ** Detailbereich, in dem Sie die Details eines 'ViewModel' anzeigen möchten. Darin haben Sie nur ** one ** '', dessen "DataContext" an die ** one ** 'ViewModel'-Instanz gebunden ist, die Sie anzeigen möchten. Dann haben Sie ** drei 's Ihrer drei' ViewModels' innerhalb eines ''. Diese '' haben ihren 'DataType' auf den Typ des' ViewModel' ohne einen x: Schlüssel gesetzt. Der Inhalt dieser ** drei ** '' sind Ihre ** drei ** "Views". Innerhalb jeder 'Ansicht' binden Sie dann einfach an die Eigenschaften des' ViewModel'. – haindl

+1

Der richtige -Typ wird automatisch von WPF übernommen. (Siehe [hier] (https://msdn.microsoft.com/en-us/library/system.windows.datatemplate.datatype (v = vs.110) .aspx), wenn Sie diese Technik noch nie zuvor verwendet haben.) – haindl