2016-07-13 12 views
1

DataTriggerとDataTemplateでビューが設定されている子ContentControlを持つコントロールがあります。私がやりたいことは、これらのコントロールのDataContextをメインのDataContextViewModelのプロパティに設定します。私のビューコードはそうそうです。私は子ビュー(TagsEditView、TagsImportViewをスヌープまでWPF:DataTemplateビューにDataContextを挿入する

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

すべての罰金です:私は、私が確認している次のプロパティを設定し、正しく更新されている必要があり含むビューのViewModelにに

<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> 

..)、DataContextが設定されていないことがわかります。

どのように私はこれらのビューにこれらのViewModelsを取得しますか?それとも私はこれについて間違った方法をとっていますか?

ご協力いただきまして誠にありがとうございます。

+0

あなたのローカルのコントロールの種類:TagsImportViewとその他のカスタムコントロールはありますか?彼らは何から継承していますか?そして、DataTemplateによってデータがテンプレート化されているコントロールは何ですか? –

答えて

1

ContentControlの場合、DataContextプロパティではなくContentプロパティを設定する必要があります。すべての子コントロールは、ContentControlのContentプロパティからDataContextを取得します。

+0

したがって、ContentControlで表示されているビューに基づいてDataContextを変更する方法はありませんか? –

+0

@FlexFiend DataContextを変更する必要があると思われる理由を説明できますか? –

+0

私はdatacontextを変更する必要はありません、私はそれらのビューに設定する必要があります。 –

0

私はあまりよく分かりませんが、これはどのように行うべきなのでしょうか。

<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> 

これは、「ViewModel-first-MVVM」と呼ばれています。

個人的には、これはTabControlにのみ使用していますので、私もこれについて専門家はいません。ほとんどの場合、私は「View-first-MVVM」に行きます。

<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

あなたはContentControlとそのContentTemplateを使用しています。

ContentTemplateは、Contentをカスタマイズするために使用されます。

あなたのケースではDataTrigger's SetterContentを設定する必要があります。そしてすべてがうまくいくでしょう。

<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> 

だから、あなたのケースであなたのDataTemplateからDataContextを削除します。以下のサンプルを参照してください。

関連する問題