需要覆盖字符串内容的默认ContentTemplate

时间:2010-09-26 16:32:32

标签: wpf binding

如果我的菜单定义如下:

<Menu>
<MenuItem Header="Stuff" />
</Menu>

当呈现它时,MenuItem内的ContentPresenter最终会得到如下内容:

<TextBlock Text="{Binding}" />

这意味着它继承了TextBlock的默认样式,这并不总是令人满意的。

我知道我可以将我的MenuItem更改为:

<MenuItem>
<MenuItem.Header>
<TextBlock Text="Stuff" Style="{DynamiResource MyStyle}" />
</MenuItem.Header>
</MenuItem>

但这将是一个烦人的要求。

我知道我可以覆盖MenuItem的默认样式来明确设置ContentTemplate,但这意味着如果内容不是String,或者MenuItem的特定实例指定了ContentTemplate,我的默认样式会覆盖 - 这会很糟糕。

我知道在WPF魔术的某个地方,有一个转换器或类似String类型的内容并创建一个使用TextBlock的DataTemplate,但我无法找到它的位置。我认为必须有某种方法来拦截这种魔法,但由于我找不到魔法发生的地方,我无法弄清楚如何拦截它。

有什么想法吗?

David Mullin

1 个答案:

答案 0 :(得分:1)

您可以让DataTemplateSelector返回字符串的自定义模板,但只返回所有其他类型的默认模板。

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