我有一个控件,它有一个子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放入这些视图中?或者我是以错误的方式解决这个问题?
非常感谢任何帮助。
答案 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
。