Pregunta

Tengo una plantilla de datos en App.xaml que une una vista a ViewModel.

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

La plantilla anterior no se aplica si no hay estilos. En el momento en que pongo un estilo, algo como ...

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

DataTemplate se recoge y produce los resultados deseados ... No estoy seguro de qué está sucediendo allí ... ¿alguien podría aclarar esto?

Gracias.

¿Fue útil?

Solución

Respondió una pregunta similar aquí. La pregunta no es exactamente la misma, que uno contenía diccionarios fusionados que se omiten, pero es muy probable que sea el mismo error.

Este es un error de optimización, ver este enlace.

En la creación de cada objeto en XAML, si está presente un estilo predeterminado (es decir, el estilo con una clave de tipo) ese estilo debe aplicarse. Como puede imaginar, hay varias optimizaciones de rendimiento para hacer que la búsqueda (implícita) sea un peso ligero posible. Uno de ellos es que no buscamos diccionarios de recursos internos a menos que sean marcados como "conteniendo estilos predeterminados". Hay un error: si todos sus estilos predeterminados están anidados en diccionarios fusionados de tres niveles de profundidad (o más profundo), el diccionario superior no se marcó, por lo que la búsqueda lo omite. El trabajo es poner un estilo predeterminado a algo, cualquier cosa, en el diccionario raíz.

Veo que ya ha encontrado la solución también, solo agregue un estilo ficticio predeterminado en App.xaml. No tiene que tener ningún setter, etc., algo así también funcionará

<Application.Resources>
    <DataTemplate DataType="{x:Type vm:someviewmodeltype}">
        <vw:somevwcontrol />
    </DataTemplate>
    <Style TargetType="{x:Type Rectangle}" /> 
</Application.Resources>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top