табличка с данными в app.xaml не поднимается без каких-либо стилей? - PullRequest
16 голосов
/ 27 января 2011

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

<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>

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

Спасибо.

1 Ответ

21 голосов
/ 27 января 2011

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

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

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

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

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