2011-01-27 7 views
13

Ho un DataTemplate in app.xaml che associa una vista a un viewmodel.in app.xaml non viene prelevato senza alcuno stile?

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

il modello precedente non viene applicato se non ci sono stili. Nel momento in cui ho messo uno stile, qualcosa di simile ...

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

DataTemplate viene raccolto e produce i risultati desiderati ... Non sono sicuro che cosa sta accadendo lì ... qualcuno potrebbe chiarire questo?

Grazie.

risposta

18

Ha risposto a una domanda simile here. La domanda non è esattamente la stessa, quella conteneva i dizionari uniti che venivano saltati ma è molto probabilmente lo stesso bug.

Questo è un bug di ottimizzazione, vedere this link.

sulla creazione di ogni oggetto in XAML, se uno stile di default è presente (vale a dire lo stile w/una chiave di tipo) che stile deve essere applicato. Come è possibile immaginare ci sono diverse ottimizzazioni prestazioni per rendere la ricerca (implicita) il più leggero possibile. Uno di questi è che non guardiamo dentro Dizionari di risorse a meno che non siano contrassegnati come "contenenti stili predefiniti ". C'è un bug: se tutti i tuoi stili predefiniti sono nidificati nei dizionari unificati in profondità (o più in profondità) il dizionario principale non viene contrassegnato come così la ricerca lo salta. La soluzione consiste nel mettere uno stile predefinito in qualcosa, qualsiasi cosa, nel dizionario root .

Vedo che hai già trovato la soluzione alternativa, basta aggiungere uno stile fittizio predefinito in App.xaml. Non deve avere setter, ecc., Qualcosa del genere lo farà anche

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

Abbiamo passato un giorno intero a cercarlo. Risolto! – JvdBerg

Problemi correlati