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 ContentPartViewModels 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:

  1. ¿Alguien puede recomendar una mejor manera de hacer esto en SL2?
  2. ¿Alguien puede confirmar si la situación ha mejorado en SL3?

Gracias, Kent

¿Fue útil?

Solución

  1. Sí. DataType en DataTemplate no se admite en Silverlight 2 o Silverlight 3.

  2. 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);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top