1

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:

  1. Quelqu'un peut-il recommander une meilleure façon de le faire dans SL2?
  2. Quelqu'un peut-il confirmer si la situation s'est améliorée dans SL3?

Merci, Kent

+0

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

Répondre

1
  1. Oui. DataType dans DataTemplate n'est pas pris en charge dans Silverlight 2 ou Silverlight 3.

  2. Vous pouvez contourner ItemTemplateSelector dans Silverlight. S'il vous plaît jeter un oeil à cet échantillon.

http://silverlight.net/forums/t/12598.aspx

protected override void PrepareContainerForItemOverride(DependencyObject element, object item) 
{ 
    base.PrepareContainerForItemOverride(element, item); 
    DataTemplateSelector selector = this.ItemTemplateSelector; 

    if (null != selector) 
    { 
     ((ContentPresenter)element).ContentTemplate = selector.SelectTemplate(item, element); 
    } 
} 
+0

Merci Michael. Pas idéal que je dois créer toute cette infrastructure et sous-classe divers ItemsControls moi-même, mais il semble que cela devrait fonctionner. Mettra à jour une fois que je l'ai essayé. –

+0

L'exemple ou cette question n'est pas vraiment complet sans ce lien: http://forums.silverlight.net/forums/t/79266.aspx Cela vous montre comment définir les ressources DataTemplate et les référencer par programme. – xanadont

Questions connexes