问题描述
在通过DataTemplateSelector实例化数据模板时,设置数据上下文来控制内部数据模板时出现问题。
这是我的 CustomView 代码结构。
我有一个 ListBox ,我向其中分配了要填充的项目列表。
在 CustomView 中将一些 DataTemplates 定义为资源:
<DataTemplate x:Key="Template1">
<views:CustomControl DataContext="{Binding ???}"/>
</DataTemplate>
<DataTemplate x:Key="Template2">
<views:CustomControl DataContext="{Binding ???}"/>
</DataTemplate>
每个ListBox项都通过 DataTemplateSelector 。
<GridViewColumn Header="Change" Width="330">
<GridViewColumn.CellTemplate>
<DataTemplate>
<ContentControl Content="{Binding}" ContentTemplateSelector="{StaticResource ResolverTemplateSelector}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
ResolverTemplateSelector 所做的全部工作是检查当前Item的属性并返回正确的DataTemplate:
CustomControl control = GetRootControl(container);
if (Item is ObjectType object)
{
DataTemplate template;
switch (object.Property)
{
case PropertyValue1:
template = FindTemplateFromString("Template1",control);
break;
case PropertyValue2:
template = FindTemplateFromString("Template2",control);
break;
}
object.DataTemplate = template;
return template;
这很好,设置了模板,并且可以在视图中看到它。 问题是我无法根据需要设置模板中实例化的 CustomControl 的 DataContext 。 我需要使用存储在 CustomView 的 viewmodel 中的属性设置其 DataContext 。 我尝试过:
<DataTemplate x:Key="Template1">
<views:CustomControl DataContext="{Binding RelativeSource={RelativeSource AncestorType={x:Type views:CustomView}},Path=DataContext}"/>
</DataTemplate>
至少要使DataContext与CustomView相同,所以我可以在后面的代码中访问其属性,但是没有运气。 DataContext始终为 null 。
有什么主意吗?也许我做错了什么?
谢谢。
解决方法
最后我可以完成这项工作。 对于其他尝试相同操作的人:
<views:CustomControl DataContext="{Binding ElementName=ParentView,Path=TargetViewModel}"/>