2010-09-26 42 views
0

如果我有這樣定義的菜單:需要覆蓋默認的ContentTemplate字符串內容

<TextBlock Text="{Binding}" /> 

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

當這個被渲染時,ContentPresenter裏面的菜單項的,像這樣的內容結束

這意味着它繼承了TextBlock的默認樣式,這並不總是可取的。

我知道,我可以改變我的菜單項是這樣的:

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

但是這將是一個惱人的要求。我知道我可以重寫MenuItem的默認樣式來明確設置ContentTemplate,但這意味着如果內容是一個字符串以外的東西,或者如果MenuItem的特定實例指定了一個ContentTemplate,我的默認值風格會覆蓋 - 這會很糟糕。我知道,在WPF的魔力的某個地方,有一個轉換器或東西,正在採取類型字符串的內容和創建使用TextBlock的DataTemplate,但我無法找到它在哪裏。我認爲必須有某種方法來攔截這種魔法,但由於我無法找到魔法發生的位置,我無法弄清楚如何攔截它。

任何想法?

大衛·穆林

回答

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