Datatemplate в app.xaml не подбирается без каких-либо стилей?

У меня есть DataTemplate в app.xaml, который привязывает представление к viewmodel.

<Application.Resources>
    <DataTemplate DataType="{x:Type vm:someviewmodeltype}">
        <vw:somevwcontrol />
    </DataTemplate>
</Application.Resources>

приведенный выше шаблон не применяется, если нет стилей. В тот момент, когда я ставил стиль, что-то вроде...

<Application.Resources>
    <DataTemplate DataType="{x:Type vm:someviewmodeltype}">
        <vw:somevwcontrol />
    </DataTemplate>
    <Style TargetType="TextBlock">
        <Setter Property="FontSize" Value="20"></Setter>
    </Style>
</Application.Resources>

datatemplate подбирается и дает желаемые результаты... Я не уверен, что происходит там... может ли кто-нибудь прояснить это?

Спасибо.

Ответы

Ответ 1

Ответил аналогичный вопрос здесь. Вопрос не совсем то же, что один из них содержит слитые словари, которые пропускаются, но это, скорее всего, та же ошибка.

Это ошибка оптимизации, см. эту ссылку.

О создании каждого объекта в XAML, если присутствует стиль по умолчанию (т.е. стиль с ключом типа), который стиль должен применяться. Как вы можете представьте, что есть несколько характеристик оптимизация, чтобы сделать это (подразумеваемое) найдите легкий вес, насколько это возможно. Один из них заключается в том, что мы не заглядываем внутрь Словари ресурсов, если они не являются помечено как "содержащий значение по умолчанию Стили". Есть ошибка: если все ваши стили по умолчанию вложены в объединенные словарей на трех уровнях (или глубже), верхний словарь не получите флаг, чтобы поиск пропускал его. Работа вокруг заключается в том, чтобы по умолчанию Стиль к чему-то, что угодно, в корневой словарь.

Я вижу, что вы уже нашли обходной путь, просто добавьте стиль фиктивного стиля в App.xaml. Он не должен иметь никаких сеттеров и т.д., Что-то вроде этого тоже будет делать

<Application.Resources>
    <DataTemplate DataType="{x:Type vm:someviewmodeltype}">
        <vw:somevwcontrol />
    </DataTemplate>
    <Style TargetType="{x:Type Rectangle}" /> 
</Application.Resources>