WPF: dal DataBinding ai Template - Seconda parte

5 pagine in totale: <<Indietro 1 2 3 [4] 5 Avanti >>

Template come risorse

Difficilmente però troveremo il Template definito inline come nell'esempio precedente, infatti, se dovessimo condividerla tra più elementi dell'interfaccia, in caso anche di piccole modifiche, cosa non rara quando si parla di grafica, pensare di propagarla su n elementi annullerebbe gran parte dell'utilità del Template.

Per rendere riutilizzabile il nostro Template è sufficiente quindi spostarne la definizione tra le risorse del contenitore comune agli elementi che dovrebbero condividere il Template (ogni FrameworkElement espone la collezione Resources) e, come fatto in precedenza utilizzeremo, le risorse dell'oggeto Window.

Spostiamo quindi tutto il suo contenuto dell'oggetto DataTemplate tra i tag Window.Resources e assegniamoli un identificativo univoco.

<DataTemplate x:Key="GameReviewTemplate">...

Dopo sarà possibile assegnare il Template utilizzando la concisa Attribute Sintax mediante l'utilizzo della Markup Extension: StaticResource.

<ListBox ItemTemplate="{StaticResource ResourceKey=GameReviewTemplate}" ItemsSource="{Binding Source={StaticResource GameReviews}, Path=GameReviews}">

L'oggetto DataTemplate dispone inoltre di un interessante non che utile proprietà chiamata DataType, simile nel funzionamento alla proprietà TargetType dell'oggetto Style.

<DataTemplate DataType="{x:Type FairPlay:GameReview}">

Impostando la proprietà DataType associamo in modo implicito al tipo dell'oggetto da visualizzare un Template particolare. Affinchè poi questo venga assegnato automaticamente, è importante rimuovere l'attributo x:Key; in questo modo viene generata una chiave implicita rintracciabile dalla ListBox.

La possibilità di selezionare automaticamente il Template in base al tipo dell'oggetto da visualizzare può tornare particolarmente utile quanto la fonte dati è presente come una collezione di oggetti eterogenei. Tornando con la memoria al nostro primo tentativo e ricordiamo la presenza tra gli oggetti della collezione, due tipi: GameReview e EditorChoice. Quest'ultimo espone una nuova proprietà EditorPrize.

Definiamo quindi un nuovo oggetto DataTemplate, che differisce dal Template associato al tipo GameReview per la presenza nella griglia di una nuova colonna e un oggetto TextBlock aggiunto in quest'ultima, per visualizzare il valore della proprietà EditorPrize; inoltre, per evidenziare il gioco premiato dall'editore, modifichiamo l'oggetto Border affinché visualizzi il proprio contorno.

<DataTemplate DataType="{x:Type FairPlay:EditorChoice}">
      <Border Padding="15" CornerRadius="10" BorderThickness="5" BorderBrush="Gold" Margin="5">
        <Border.Background>
          <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
            <GradientStop Color="DarkGray" Offset="0.0" />
            <GradientStop Color="Black" Offset="1.0" />
          </LinearGradientBrush>
        </Border.Background>
        <Grid>
          <Grid.ColumnDefinitions>
            <ColumnDefinition Width="60px" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
          </Grid.ColumnDefinitions>
          <Grid.RowDefinitions>
            <RowDefinition />
          </Grid.RowDefinitions>
          <Image Grid.Row="0" Grid.Column="0"  Source="{Binding Path=Game.Cover}"  Stretch="UniformToFill" >
            <Image.RenderTransform>
              <SkewTransform CenterX="35" CenterY="25" AngleX="0" AngleY="-25" />
            </Image.RenderTransform>
            <Image.BitmapEffect>
              <DropShadowBitmapEffect Color="Black" Direction="130" ShadowDepth="15" Softness="0.5" Opacity="0.6"/>
            </Image.BitmapEffect>
          </Image>
          <TextBlock FontSize="18" Foreground="White"   VerticalAlignment="Center"  TextAlignment="Center" Grid.Row="0" Grid.Column="1"  Text="{Binding Path=Game.Name}"></TextBlock>
          <TextBlock FontSize="18" Foreground="White" VerticalAlignment="Center" TextAlignment="Center" Grid.Row="0" Grid.Column="2"  Text="{Binding Path=Vote}"></TextBlock>
          <TextBlock FontSize="18" Foreground="White" VerticalAlignment="Center" TextAlignment="Center" Grid.Row="0" Grid.Column="3"  Text="{Binding Path=EditorPrize}"></TextBlock>
        </Grid>
      </Border>
    </DataTemplate>

DataTemplate con DataType

Dopo quest'ultima modifica ogni occorrenza del tipo EditorChoice viene visualizzato usando il nuovo Template, rendendo così possibile mostrare le proprietà esclusive esposte dal tipo.

5 pagine in totale: <<Indietro 1 2 3 [4] 5 Avanti >>

Attenzione: Questo articolo contiene un allegato

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.



TUTORIALS


IN EVIDENZA
MISC