2011-01-27 1 views
13

У меня есть DataTemplate в app.xaml, который привязывает представление к viewmodel.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> 

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

Спасибо.

ответ

18

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

Это ошибка оптимизации, см. this link.

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

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

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

Провел целый день, ища это. Решено! – JvdBerg