2016-07-13 6 views
1

Ich habe ein Steuerelement, das über ein untergeordnetes ContentControl verfügt, dessen Ansicht über einen DataTrigger und DataTemplate festgelegt wird. Ich möchte den DataContext dieser Steuerelemente auf eine Eigenschaft meines DataContextViewModel-Hauptelements festlegen. Mein Ansichtscode sieht so aus.WPF: DataContext in DataTemplate View einbinden

<UserControl.Resources> 
     <DataTemplate x:Key="ManageTags"> 
      <local:TagsEditView DataContext="{Binding Path=TagsEditViewModel}">   
      </local:TagsEditView> 
     </DataTemplate> 
     <DataTemplate x:Key="ExportTags"> 
      <local:TagsExportView DataContext="{Binding Path=TagsExportViewModel}"> 
      </local:TagsExportView> 
     </DataTemplate> 
     <DataTemplate x:Key="ImportTags"> 
      <local:TagsImportView DataContext="{Binding Path=TagsImportViewModel}"> 
       </local:TagsImportView> 
     </DataTemplate> 

Auf dem Ansichtsmodell der enthaltenden Ansicht habe ich die folgenden Eigenschaften, die ich bestätigt habe richtig eingestellt wird und aktualisiert:

public TagsExportViewModel TagsExportViewModel { get; set; } 
    public TagsImportViewModel TagsImportViewModel { get; set; } 
    public TagsEditViewModel TagsEditViewModel { get; set; } 

Alles ist in Ordnung, bis ich die Kinder Ansichten (TagsEditView, TagsImportView Snoop ..) und dann sehe ich, dass der DataContext nicht gesetzt ist.

Wie bekomme ich diese ViewModels in diese Ansichten? Oder mache ich das falsch?

Jede Hilfe wird sehr geschätzt.

+0

Welche Art von Steuerelement ist Ihre lokale: TagsImportView und die anderen benutzerdefinierten Steuerelemente? Von was erben sie? Und was ist das Control, dessen Daten von Ihrem DataTemplate templatiert werden? –

Antwort

1

Für ein ContentControl müssen Sie die Content-Eigenschaft und nicht die DataContext-Eigenschaft festlegen. Alle untergeordneten Steuerelemente nehmen ihren DataContext dann aus der Content-Eigenschaft des ContentControls.

+0

So gibt es keine Möglichkeit, den DataContext basierend auf der Ansicht zu ändern, die im ContentControl angezeigt wird? –

+0

@FlexFiend Können Sie erklären, warum Sie den DataContext ändern müssen? –

+0

Ich muss den Datenkontext nicht ändern, ich muss ihn auf diese Ansichten setzen. –

0

Ich bin nicht sehr sicher, aber so sollte es sein.

<DataTemplate x:Key="ManageTags" DataType="{x:Type vm:TagsEditViewModel}"> 
    <local:TagsEditView /> 
</DataTemplate> 
<DataTemplate x:Key="ExportTags" DataType="{x:Type vm:TagsExportViewModel}"> 
    <local:TagsExportView /> 
</DataTemplate> 
<DataTemplate x:Key="ImportTags" DataType="{x:Type vm:TagsImportViewModel}"> 
    <local:TagsImportView /> 
</DataTemplate> 

Dies ist, was sie "ViewModel-first-MVVM" nennen.

Persönlich habe ich nur dieses für TabControl verwendet, also bin ich auch kein Experte auf diesem. Die meiste Zeit würde ich nur "View-First-MVVM" gehen.

<local:TagsEditView> 
    <local:TagsEditView.DataContext> 
     <vm:TagsEditViewModel /> 
    </local:TagsEditView.DataContext> 
</local:TagsEditView> 
<local:TagsExportView> 
    <local:TagsExportView.DataContext> 
     <vm:TagsExportViewModel /> 
    </local:TagsExportView.DataContext> 
</local:TagsExportView> 
<local:TagsImportView> 
    <local:TagsImportView.DataContext> 
     <vm:TagsImportViewModel /> 
    </local:TagsImportView.DataContext> 
</local:TagsImportView> 
0

Sie verwenden ContentControl und seine ContentTemplate.

ContentTemplate wird verwendet, um Content anzupassen.

Also, hier in Ihrem Fall müssen Sie Content in Ihrem DataTrigger's Setter setzen. Und alles wird sich einfügen. Siehe Beispiel unten:

<DataTrigger Binding="{Binding CurrentVMindex}" Value="1"> 
    <Setter Property="Content" Value="{Binding VM1}"/> 
    <Setter Property="ContentTemplate" Value="{StaticResource VM1Key}"/> 
</DataTrigger> 

<DataTemplate x:Key="VM1Key"> 
    <TextBlock Background="Green" Text="{Binding Name, Mode=OneWay}"/> 
</DataTemplate> 

also in Ihrem Fall entfernen DataContext von Ihrem DataTemplate.