如何解决通过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}"/>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。