Необходимо переопределить ContentTemplate по умолчанию для содержимого строки - PullRequest
0 голосов
/ 26 сентября 2010

Если у меня есть меню, определенное следующим образом:

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

Когда это визуализируется, ContentPresenter внутри MenuItem заканчивается содержимым, подобным этому:

<TextBlock Text="{Binding}" />

, что означаетчто он наследует стиль TextBlock по умолчанию, что не всегда желательно.

Я знаю, что могу изменить свой MenuItem на что-то вроде:

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

, но это будет раздражатьтребование.

Я знаю, что могу переопределить стиль по умолчанию MenuItem для явной установки ContentTemplate, но это будет означать, что если содержимое было чем-то отличным от String, или если конкретный экземпляр MenuItem определилContentTemplate, мой стиль по умолчанию переопределяет это - что было бы плохо.

Я знаю, что где-то в магии WPF есть конвертер или что-то, что берет содержимое типа String и создает DataTemplate, который используетTextBlock, но я не могу найти, где это.Я полагаю, что должен быть какой-то способ перехватить эту магию, но, поскольку я не могу определить, где происходит магия, я не могу понять, как ее перехватить.

Есть идеи?

Дэвид Маллин

1 Ответ

1 голос
/ 26 сентября 2010

Вы можете сделать 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);               
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...