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);               
    }
}