通过DataTemplateSelector

问题描述

在通过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}"/>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...