Windows Phone 7: ako zobrazovať objekty rôznych typov v jednom listboxe
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