<Window x:Class="Esempio_Tab___List.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Esempio_Tab___List"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="Esempio Tab + ListView" Height="375" Width="350"
WindowStartupLocation="CenterScreen"
Icon="/Esempio%20Tab%20%2b%20List;component/icon.ico"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<!--La riga che sta sopra (DataContext) serve per indicare alla classe che
gestisce la finestra principale (MainWindow) che il binding della ListView (ItemSource <-> ListOfObject)
dev'essere fatto attraverso una proprietà (ListOfObject) della classe stessa (MainWindow). -->
<!--Dizionario locale di elementi utilizzabili nella finestra.
Ogni elemento deve avere una chiave di riconoscimento (X:Key)
per poter essere instanziato.-->
<Window.Resources>
<!--Template per la CheckBox della terza colonna-->
<DataTemplate x:Key="CheckBoxTemplate">
<StackPanel>
<CheckBox IsChecked="{Binding Graduate}"/>
</StackPanel>
</DataTemplate>
<!--Permette di effettuare il binding con un'enumerazione-->
<ObjectDataProvider x:Key="MusicData" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="local:eMusic" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<!--Template per la ComboBox della quarta colonna-->
<DataTemplate x:Key="ComboBoxTemplate">
<StackPanel>
<ComboBox ItemsSource="{Binding Source={StaticResource MusicData}}"
SelectedItem="{Binding Music}" SelectionChanged="ComboBox_SelectionChanged" />
</StackPanel>
</DataTemplate>
<!--Template per il bottone della quinta colonna-->
<DataTemplate x:Key="ButtonTemplate">
<StackPanel>
<Button Click="QuitBtn_Click" Width="35" Height="20">
<Button.Content>
<Image Source="del2.png" />
</Button.Content>
</Button>
</StackPanel>
</DataTemplate>
<!--Definisce il tipo di organizzazione della ListView:
due campi legati alle rispettive proprietà degli oggetti
che compongono la lista (ListOfObject)-->
<GridView x:Key="LView" x:Shared="False">
<GridViewColumn Header="Nome" DisplayMemberBinding="{Binding Name}" />
<GridViewColumn Header="Età" DisplayMemberBinding="{Binding Age}" />
<GridViewColumn Header="Diplomato" CellTemplate="{StaticResource CheckBoxTemplate}" />
<GridViewColumn Header="Musica" CellTemplate="{StaticResource ComboBoxTemplate}" />
<GridViewColumn Header="Quit" CellTemplate="{StaticResource ButtonTemplate}" />
</GridView>
<!--Definisce lo stile che modifica il background degli elementi della
ListView in base al valore dell'attributo Age.-->
<Style x:Key="ContainerStyleItemValue" TargetType="{x:Type ListViewItem}">
<Style.Resources>
<!-- Convertitore: il valore dell'età viene convertito nei
valori -1, 0, o +1 -->
<local:NumberToPolarValueConverter x:Key="PolarValueConv" />
</Style.Resources>
<Style.Triggers>
<!-- Quando l'età supera i 20 il background è verde -->
<DataTrigger Binding="{Binding Age, Converter={StaticResource PolarValueConv}}" Value="+1">
<Setter Property="Background" Value="LightGreen" />
</DataTrigger>
<!-- Quando l'età è sotto i 20 il background è rosso -->
<DataTrigger Binding="{Binding Age, Converter={StaticResource PolarValueConv}}" Value="-1">
<Setter Property="Background" Value="LightYellow" />
</DataTrigger>
</Style.Triggers>
</Style>
<!--Definisce lo stile degli elementi della seconda lista (ordinati per età)
in modo che l'elemento selezionato abbia background Coral.-->
<Style TargetType="{x:Type ListViewItem}" x:Key="ContainerStyleSelectItem">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="Coral"/>
</Trigger>
</Style.Triggers>
<!--Imposta un evento di doppio click-->
<EventSetter Event="MouseDoubleClick" Handler="SetDblClickColor" />
</Style>
<!--Definisce il tipo di raggruppamento per la ListView e quale proprietà
dev'essere presa come riferimento-->
<CollectionViewSource x:Key="CollectionViewSrc" Source="{Binding ListOfObject}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Music" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</Window.Resources>
<!-- Per il contenitore di Tab serve un TabControl:
http://msdn.microsoft.com/en-us/library/system.windows.controls.tabcontrol.aspx -->
<TabControl SelectionChanged="TabControl_SelectionChanged">
<!-- Ogni Tab corrisponde all'oggetto TabItem:
http://msdn.microsoft.com/en-us/library/system.windows.controls.tabitem.aspx -->
<TabItem x:Name="TabByName" Header="Ordinati per nome">
<!--Ogni TabItem Contiene una ListView alla quale viene
"legata" la collezione di oggetti che devono essere visualizzati (ItemSource),
il formato di visualizzazione (View), e lo stile degli elementi
che compongono le righe (ItemContainerStyle)-->
<ListView ItemsSource="{Binding ListOfObject}"
View="{StaticResource LView}"
ItemContainerStyle="{StaticResource ContainerStyleItemValue}" />
</TabItem>
<TabItem x:Name="TabByAge" Header="Ordinati per età">
<ListView ItemsSource="{Binding ListOfObject}"
View="{StaticResource LView}"
ItemContainerStyle="{StaticResource ContainerStyleSelectItem}" />
</TabItem>
<TabItem x:Name="TabByGroup" Header="Raggruppati per musica">
<ListView ItemsSource='{Binding Source={StaticResource CollectionViewSrc}}'
BorderThickness="0" View="{StaticResource LView}" x:Name="GListView">
<!--Definisce lo stile del raggruppamento-->
<ListView.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Margin" Value="0,0,0,5"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander IsExpanded="True" BorderThickness="0,0,0,1">
<Expander.Header>
<DockPanel>
<TextBlock FontWeight="Bold" Text="{Binding Path=Name}"
Margin="5,0,0,0" Width="50"/>
<TextBlock Text="{Binding Path=ItemCount}" FontStyle="Italic"/>
</DockPanel>
</Expander.Header>
<Expander.Content>
<ItemsPresenter />
</Expander.Content>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</ListView.GroupStyle>
</ListView>
</TabItem>
</TabControl>
</Window>