<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>