UWP中如何在子类B的DataTemplate中复用父类A的DataTemplate?
解决子类DataTemplate复用父类模板的问题
问题根源
你选择用ContentPresenter复用父类A的Atemplate是正确思路,但绑定Content属性时的写法错误,导致绑定项为null。{x:Bind (namespace:B)}是类型转换语法,并非绑定当前实例的正确方式。
正确实现方案
由于B继承自A,当前Btemplate的DataContext就是B的实例,而B实例可直接适配A的DataTemplate。只需修正Content的绑定表达式,同时注意DataTemplate必须有唯一根元素,以下是两种可行方式:
方式1:直接指定父类模板(推荐)
若明确复用Atemplate,无需模板选择器,直接绑定当前实例并指定模板:
<DataTemplate x:Key="Btemplate" x:DataType="namespace:B"> <!-- 用StackPanel作为根容器包裹元素 --> <StackPanel> <!-- B新增的自定义元素 --> <TextBlock Text="{x:Bind name}" /> <!-- 复用A的DataTemplate --> <ContentPresenter Content="{x:Bind}" <!-- 绑定当前B实例,等价于{x:Bind .} --> ContentTemplate="{StaticResource Atemplate}" /> </StackPanel> </DataTemplate>
方式2:保留DataTemplateSelector的方案
若必须使用模板选择器,只需修正Content的绑定表达式:
<DataTemplate x:Key="Btemplate" x:DataType="namespace:B"> <StackPanel> <TextBlock Text="{x:Bind name}" /> <ContentPresenter Content="{x:Bind}" <!-- 正确绑定当前实例 --> ContentTemplateSelector="{StaticResource ADataTemplateSelector}" /> </StackPanel> </DataTemplate>
关键说明
- 在指定
x:DataType的前提下,{x:Bind}默认绑定当前模板的DataContext(即B实例),无需额外类型转换语法。 DataTemplate要求必须有唯一根元素,你之前的代码直接放置多个元素会引发布局错误,因此需要用StackPanel等容器包裹。
内容的提问来源于stack exchange,提问作者Guy Madmon
相关产品推荐
相关产品推荐

