El procesamiento de una colección heterogénea de Visualización de modelos en Silverlight 2
-
13-09-2019 - |
Pregunta
Tengo una jerarquía de modelos de vista que representan contenido formateado:
public abstract class ContentPartViewModel : ViewModel
{
}
public class TextContentPartViewModel : ContentPartViewModel
{
public string Text { ... }
}
public class TitleContentPartViewModel : TextContentPartViewModel
{
}
public class HyperlinkContentPartViewModel : TextContentPartViewModel
{
public string Uri { ... }
}
Tengo un modelo de vista global que contiene una colección de ContentPartViewModel
s que pasarán a ser:
public class ContentViewModel
{
public ICollection<ContentPartViewModel> ContentParts { ... }
}
I después que tenga una ContentView
que hace que todas las partes del contenido:
<UserControl ...>
<ItemsControl ItemsSource="{Binding ContentParts}"/>
</UserControl>
En un mundo ideal, me gustaría definir un DataTemplate
para cada uno de los tipos de piezas de contenido y que se volvería en consecuencia. Sin embargo, Silverlight no admite la propiedad DataType
en la clase DataTemplate
, por lo que no es una opción.
Otra opción sería la de proporcionar un DataTemplateSelector
y hacer el mapeo de tipo de vista del modelo de DataTemplate
mí mismo. Por desgracia, en ItemsControl
SL2 no tiene una propiedad ItemTemplateSelector
- solamente una propiedad ItemTemplate
Esto me queda otra opción sino para proporcionar una ItemTemplate
que a continuación, utiliza un convertidor para apagar toda la interfaz de usuario, aparte de la pieza correspondiente a la parte de contenido:
<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>
Esto es obviamente bastante horrible, tanto para el rendimiento y para facilitar la lectura / corrección de código. También hace que sea mucho más difícil para mí para dar formato a la salida correcta. Por lo tanto, las preguntas:
- ¿Alguien puede recomendar una mejor manera de hacer esto en SL2?
- ¿Alguien puede confirmar si la situación ha mejorado en SL3?
Gracias, Kent
Solución
-
Sí. DataType en DataTemplate no se admite en Silverlight 2 o Silverlight 3.
-
Puede solucionar ItemTemplateSelector en Silverlight. Por favor, eche un vistazo a esta muestra.
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);
}
}