首页 > 解决方案 > 通过 DataTemplateSelector 设置 DataContext

问题描述

我在通过 DataTemplateSelector 实例化数据模板时将数据上下文设置为数据模板内的控件时遇到问题。

这是我的CustomView代码结构。

我有一个ListBox,我为其分配要填充的项目列表。

一些DataTemplateCustomView中定义为资源:

<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

任何想法?也许我做错了什么?

谢谢。

标签: c#wpfdatatemplatedatacontext

解决方案


最后,我可以完成这项工作。对于其他尝试相同事情的人:

  <views:CustomControl DataContext="{Binding ElementName=ParentView, Path=TargetViewModel}"/>

推荐阅读