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

  1. Qualcuno può consigliare un modo migliore per fare questo in SL2?
  2. Qualcuno può confermare se la situazione è migliorata in SL3?

Grazie, Kent

È stato utile?

Soluzione

  1. Sì. DataType in DataTemplate non è supportato in Silverlight 2 o Silverlight 3.

  2. È 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);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top