Wpf 需要覆盖字符串内容的默认ContentTemplate
如果我有这样定义的菜单:Wpf 需要覆盖字符串内容的默认ContentTemplate,wpf,binding,Wpf,Binding,如果我有这样定义的菜单: <Menu> <MenuItem Header="Stuff" /> </Menu> <TextBlock Text="{Binding}" /> 呈现此内容时,MenuItem中的ContentPresenter将以如下内容结束: <Menu> <MenuItem Header="Stuff" /> </Menu> <TextBlock Text="{Binding}"
<Menu>
<MenuItem Header="Stuff" />
</Menu>
<TextBlock Text="{Binding}" />
呈现此内容时,MenuItem中的ContentPresenter将以如下内容结束:
<Menu>
<MenuItem Header="Stuff" />
</Menu>
<TextBlock Text="{Binding}" />
这意味着它继承了TextBlock的默认样式,这并不总是可取的
我知道我可以将菜单项更改为:
<MenuItem>
<MenuItem.Header>
<TextBlock Text="Stuff" Style="{DynamiResource MyStyle}" />
</MenuItem.Header>
</MenuItem>
但这将是一个恼人的要求
我知道我可以覆盖MenuItem的默认样式来明确设置ContentTemplate,但这意味着如果内容不是字符串,或者MenuItem的特定实例指定了ContentTemplate,我的默认样式将覆盖该样式,这是不好的
我知道,在WPF的神奇之处,有一个转换器或其他东西正在获取String类型的内容,并创建一个使用TextBlock的DataTemplate,但我找不到它在哪里。我想一定有某种方法可以拦截魔法,但由于我无法定位魔法发生的位置,所以我不知道如何拦截它
有什么想法吗
David Mullin您可以创建一个返回字符串的自定义模板,但只返回所有其他类型的默认模板
public class MenuStringDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate
SelectTemplate(object item, DependencyObject container)
{
if(item is string)
//TODO return your template
return base.SelectTemplate(item, container);
}
}