c# - 通过 DataTemplateSelector 设置 DataContext
问题描述
我在通过 DataTemplateSelector 实例化数据模板时将数据上下文设置为数据模板内的控件时遇到问题。
这是我的CustomView代码结构。
我有一个ListBox,我为其分配要填充的项目列表。
一些DataTemplate在CustomView中定义为资源:
<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}"/>
推荐阅读
- excel - 将变量从用户窗体传递到模块
- git - OpenSSL 和原生 windows 安全通道库有什么区别
- sql-server - 实体框架和 JSON.NET 序列化
- spring - Spring Boot 中用于 Amazon Aurora Serverless 的数据 API
- emacs - 重映射邪恶模式写入
- swift - Xcode 对“绑定”的期望是什么
“占位符? - java - 从带有处理指令的 XML 文件中读取并写入另一个输出文件
- python - 如何将固定数字添加到文件名的整数部分?
- python - 如何将文本中的一行视为整数?
- android - Xamarin Forms Android - 将操作系统时间更改为较早日期后应用程序无法启动