WPF: dal DataBinding ai Template - Terza parte

di Marco Leoncini, in Windows Presentation Foundation,

L'articolo è la continuazione della seconda parte pubblicata il 6 novembre 2007.

Selezionare i Template con DataTemplateSelector

Abbiamo visto come sia possibile eseguire un'associazione implicita tra l'oggetto e il template per visualizzarlo. In altri scenari questa logica implicita non sempre è adeguata e i parametri per decidere il templare da utilizzare possono essere diversi. A questo scopo WPF mette a disposizione la classe DataTemplateSelector che assegnandola alla proprietà ItemTemplateSelector, esposta dalla classe LisBox e da tutti i tipi derivati da ItemsControl, ci permette di scegliere il template da utilizzare al momento secondo logiche personalizzate.

Creiamo quindi una nuova classe derivata da DataTemplateSelector ed eseguiamo l'override del metodo SelectTemplate.

namespace MyGamePlace
{
    public class ByGameGenreDataTemplateSelector : DataTemplateSelector
    {
        public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
        {
            GameReview _gameReview = item as GameReview;

            if (_gameReview != null)
            {
                //recupero la finestra corretente che contiene tra le sue risorse il DataTemplate da utilizzare
                Window _window = Application.Current.MainWindow;

                //applico la mia logica di selezione
                if (_gameReview.Game.Genre == GameGenre.Rpg)
                {
                    //recupero la risorsa
                    return _window.FindResource("RpjGameReview") as DataTemplate;
                }

                return null;
            }
            return null;
        }
    }
}

La firma del metodo dichiara due parametri: il primo di tipo object riceve l'oggetto da valutare per selezionare il template, nel nostro caso il tipo GameReview o EditorChoice , mentre il secondo e ultimo parametro del tipo DependencyObject riceve l'elemento di destinazione del template.

Aggiungiamo, come già abbiamo fatto in precedenza, ByGameGenreDataTemplateSelector tra le risorse dell'oggetto Window e impostiamo la proprietà ItemTemplateSelector.

<ListBox
  ItemsSource="{Binding Source={StaticResource GameReviews}, Path=GameReviews}"
  HorizontalContentAlignment="Stretch"
  ItemTemplateSelector="{StaticResource ByGenreDataTemplateSelector}">
5 pagine in totale: 1 2 3 4 5
Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti