WPF:将DataContext注入DataTemplate视图

时间:2016-07-13 23:11:19

标签: wpf dependency-injection

我有一个控件,它有一个子ContentControl,其视图是通过DataTrigger和DataTemplate设置的。我想做的是将这些控件的DataContext设置为我的主DataContextViewModel的属性。我的视图代码看起来像这样。

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

在包含视图的ViewModel上,我已经确认正确设置和更新了以下属性:

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

一直很好,直到我窥探子视图(TagsEditView,TagsImportView ..),然后我看到没有设置DataContext。

我如何将这些ViewModel放入这些视图中?或者我是以错误的方式解决这个问题?

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

对于ContentControl,您需要设置Content属性,而不是DataContext属性。然后,所有子控件将从ContentControl的Content属性中获取其DataContext。

答案 1 :(得分: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>

这就是他们所说的&#34; ViewModel-first-MVVM。&#34;

就个人而言,我只是将TabControl用于此,所以我也不是这方面的专家。大多数时候我只是去查看第一个MVVM。&#34;

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

答案 2 :(得分:0)

您正在使用ContentControl及其ContentTemplate

ContentTemplate用于自定义Content

因此,在您的情况下,您必须在Content中设置DataTrigger's Setter。一切都将落实到位。见下面的示例:

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

因此,在您的案例中,从DataContext删除DataTemplate