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

StackOverflow https://stackoverflow.com/questions/4813488

Вопрос

У меня есть 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 забирается и дает желаемые результаты ... Я не уверен, что там происходит ... может ли кто -нибудь это прояснить?

Спасибо.

Это было полезно?

Решение

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

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

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

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

<Application.Resources>
    <DataTemplate DataType="{x:Type vm:someviewmodeltype}">
        <vw:somevwcontrol />
    </DataTemplate>
    <Style TargetType="{x:Type Rectangle}" /> 
</Application.Resources>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top