Igor Kulman

Windows Phone 7: ako zobrazovať objekty rôznych typov v jednom listboxe

· Igor Kulman

Listbox vo Windows Phone 7 narozdiel od Listboxu vo WPF neobsahuje triggre ani žiadnu inú podporu pre zobrazovanie rôznych prvkov pomocou rôznych šablón. Ak teda chcete zobrazovať v listboxe rôzne objekty (napr. adresárová štruktúra obsahujúca adresáre a súbory), musíte na to ísť trochu zložitejšie.

Postup si vysvetlíme na príklade, budeme zobrazovať objekty tried RestaurantViewModel a MealViewModel v jednom listboxe. Prvým krokom je vytvorenie príslušných šablón, ktoré objekty týchto tried zobrazia podľa našich požiadaviek.

<phone:PhoneApplicationPage.Resources> 
    <local:ClassToTemplatex:Key="ClassToTemplate"/> 
</phone:PhoneApplicationPage.Resources>

Na rozlíšenie, ktorá z týchto dvoch šablón sa má pre konkrétny prvok listboxu použiť vytvoríme konvertor.

public class ClassToTemplate:IValueConverter 
{ 
 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
        if (value is RestaurantViewModel) 
        { 
            return Application.Current.Resources["restaurantTemplate"] as DataTemplate; 
        } 
        else if (value is MealViewModel) 
        { 
            return Application.Current.Resources["mealTemplate"] as DataTemplate; 
        } 
        else 
        { 
            throw new ArgumentException(value.GetType().ToString()); 
        } 
    } 
 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
        throw new NotImplementedException(); 
    }
}

Tento konvertor vložíme do stránky s cieľovým listboxom.

<phone:PhoneApplicationPage.Resources> 
    <local:ClassToTemplatex:Key="ClassToTemplate"/> 
</phone:PhoneApplicationPage.Resources>

A nastavíme jeho použitie v šablóne listboxu.

<ListBox  ItemsSource="{Binding ...}" > 
     <ListBox.ItemTemplate> 
         <DataTemplate> 
              <ContentControl Content="{Binding}" 
                 ContentTemplate="{Binding Converter={StaticResource "ClassToTemplate}}"/> 
         </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox>

Ako zdroj dát listboxu je potrebné nastaviť ObservableCollection, prípadne List nejakého iného spoločného predka.