Il rendering di una raccolta eterogenea di visualizzare i modelli in Silverlight 2
-
13-09-2019 - |
Domanda
ho una gerarchia di modelli vista che rappresentano contenuto formattato:
public abstract class ContentPartViewModel : ViewModel
{
}
public class TextContentPartViewModel : ContentPartViewModel
{
public string Text { ... }
}
public class TitleContentPartViewModel : TextContentPartViewModel
{
}
public class HyperlinkContentPartViewModel : TextContentPartViewModel
{
public string Uri { ... }
}
Ho un modello che comprende vista che contiene una raccolta di ContentPartViewModel
s da rendere:
public class ContentViewModel
{
public ICollection<ContentPartViewModel> ContentParts { ... }
}
Ho poi ho un ContentView
che rende tutte le parti del contenuto:
<UserControl ...>
<ItemsControl ItemsSource="{Binding ContentParts}"/>
</UserControl>
In un mondo ideale, vorrei solo definire un DataTemplate
per ognuno dei tipi di parte di contenuto e si sarebbe resa di conseguenza. Tuttavia, Silverlight non supporta la proprietà DataType
sulla classe DataTemplate
, in modo che non è un'opzione.
Un'altra opzione sarebbe quella di fornire una DataTemplateSelector
e fare la mappatura dal tipo di vista del modello di DataTemplate
me stesso. Ahimè, ItemsControl
in SL2 non ha una proprietà ItemTemplateSelector
- solo una proprietà ItemTemplate
che mi ha lasciato altra scelta che per fornire una ItemTemplate
che quindi utilizza un convertitore per spegnere tutta l'interfaccia utente a parte il pezzo rilevante per quella parte contenuti:
<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>
Questo è ovviamente piuttosto terribile, sia per le prestazioni e per migliorare la leggibilità / correttezza del codice. Inoltre lo rende molto più difficile per me per formattare l'output in modo corretto. Quindi, le domande:
- Qualcuno può consigliare un modo migliore per fare questo in SL2?
- Qualcuno può confermare se la situazione è migliorata in SL3?
Grazie, Kent
Soluzione
-
Sì. DataType in DataTemplate non è supportato in Silverlight 2 o Silverlight 3.
-
È possibile aggirare ItemTemplateSelector in Silverlight. Si prega di dare un'occhiata a questo campione.
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);
}
}