如何在ContentControl显示默认模板时将其折叠?
ContentControl无匹配模板时自动折叠的实现方案
这一需求完全可以实现,以下是3种常用的可行方案:
方案1:修改ContentTemplateSelector兜底逻辑(最推荐)
在自定义的DataTemplateSelector子类的SelectTemplate方法中,匹配不到预设模板时直接返回null,再配合样式触发器实现折叠:
- 自定义TemplateSelector代码示例
public class CustomTemplateSelector : DataTemplateSelector { // 预设模板依赖属性 public DataTemplate TypeATemplate { get; set; } public DataTemplate TypeBTemplate { get; set; } public override DataTemplate SelectTemplate(object item, DependencyObject container) { // 原有匹配逻辑 if (item is TypeA) return TypeATemplate; if (item is TypeB) return TypeBTemplate; // 匹配不到时返回null return null; } }
- XAML中增加样式触发器
<ContentControl Content="{Binding TargetContent}" ContentTemplateSelector="{StaticResource CustomTemplateSelector}"> <ContentControl.Style> <Style TargetType="ContentControl"> <Style.Triggers> <!-- ContentTemplate为null时自动折叠 --> <Trigger Property="ContentTemplate" Value="{x:Null}"> <Setter Property="Visibility" Value="Collapsed"/> </Trigger> </Style.Triggers> </Style> </ContentControl.Style> </ContentControl>
方案2:设置兜底空模板
如果不想修改原有TemplateSelector的逻辑,可以直接给ContentControl指定一个空的兜底ContentTemplate,匹配失败时不会渲染任何内容:
<ContentControl Content="{Binding TargetContent}" ContentTemplateSelector="{StaticResource CustomTemplateSelector}"> <!-- 兜底空模板 --> <ContentControl.ContentTemplate> <DataTemplate/> </ContentControl.ContentTemplate> </ContentControl>
方案3:针对默认渲染逻辑触发折叠
如果你完全不想修改原有模板逻辑和控件基础配置,可以新增转换器判断控件是否触发了默认兜底渲染:当ContentControl的子元素为默认生成的TextBlock、且文本为Content的类型名称时,返回Collapsed作为Visibility值即可,不需要修改原有业务逻辑。
内容的提问来源于stack exchange,提问作者Craig
相关产品推荐
相关产品推荐

