J'ai une hiérarchie de modèles de vue représentant le contenu mis en forme:rendu une collection hétérogène de modèles de vue dans Silverlight 2
public abstract class ContentPartViewModel : ViewModel
{
}
public class TextContentPartViewModel : ContentPartViewModel
{
public string Text { ... }
}
public class TitleContentPartViewModel : TextContentPartViewModel
{
}
public class HyperlinkContentPartViewModel : TextContentPartViewModel
{
public string Uri { ... }
}
J'ai un modèle de vue global qui contient une collection de ContentPartViewModel
s à rendre:
public class ContentViewModel
{
public ICollection<ContentPartViewModel> ContentParts { ... }
}
J'ai alors un ContentView
qui rend toutes les parties du contenu:
<UserControl ...>
<ItemsControl ItemsSource="{Binding ContentParts}"/>
</UserControl>
Dans un monde idéal, je voudrais simplement définir un DataTemplate
pour chacun des types de partie de contenu et ils seraient rendus en conséquence. Toutefois, Silverlight ne prend pas en charge la propriété DataType
sur la classe DataTemplate
, donc ce n'est pas une option.
Une autre option serait de fournir un DataTemplateSelector
et de faire le mappage du type de modèle de vue à DataTemplate
moi-même. Hélas, ItemsControl
dans SL2 n'a pas une propriété ItemTemplateSelector
- seulement une propriété ItemTemplate
.
qui m'a laissé sans autre choix que de fournir une ItemTemplate
qui utilise ensuite un convertisseur pour désactiver toutes l'interface utilisateur en dehors de la pièce concernée à cette partie de contenu:
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding Text}" FontWeight="Bold" Visibility="{Binding Converter={StaticResource TitleContentPartConverter}}"/>
<TextBlock Text="{Binding Text}" Visibility="{Binding Converter={StaticResource TextContentPartConverter}}"/>
<HyperlinkButton Content="{Binding Text}" NavigateUri="{Binding Uri}" Visibility="{Binding Converter={StaticResource HyperlinkContentPartConverter}}"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
C'est évidemment assez terrible, à la fois pour la performance et pour la lisibilité/l'exactitude du code. Cela rend également beaucoup plus difficile pour moi de formater la sortie correctement. Donc, des questions:
- Quelqu'un peut-il recommander une meilleure façon de le faire dans SL2?
- Quelqu'un peut-il confirmer si la situation s'est améliorée dans SL3?
Merci, Kent
si elle vous fait vous sentir mieux, le « View » dans MODELVIEW explique en fait la présence de choses de visibilité dans vos fixations. Je ressens cependant votre douleur (et j'attends aussi SL5) – Vlagged