using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.ComponentModel;
namespace Esempio_Tab___List
{
// Tipo di oggetto inseribile nella lista
public class ObjT
{
// Nome ed età rappresentano i campi della lista
public string Name { get; set; }
public int Age { get; set; }
public bool Graduate { get; set; }
public eMusic Music { get; set; }
}
// Enumerazione dei generi musicali
public enum eMusic
{
Rock,
Pop,
Classic
}
// Finestra principale dell'applicazione
public partial class MainWindow : Window
{
// Costruttore della finestra principale
public MainWindow()
{
InitializeComponent();
InitList();
}
/* La scelta del tipo di lista è importante!
* Ci sono essenzialmente due liste: List<T> e ObservableCollection<T>
*
* List<T>: è la collezione base, e presenta tutti i metodi più noti
* per gestire una lista; in particolare è possibile ordinarla (metodo Sort),
* ma una sua modifica (inserimento, rimozione, ...) non si riflette
* direttamente sulla ListView visualizzata dall'applicazione.
*
* ObservableCollection<T>: è la collezzione creata appositamente per gestire
* liste i cui cambiamenti (inserimento, rimozione, ...) devono essere
* riflessi su altri controlli mediante il Binding (in questo caso si fa il
* binding con gli oggetti della ListView); è la più adatta per questo tipo
* di lavoro (più efficiente e chiara), ma non è possibile ordinarla.
*/
private ObservableCollection<ObjT> list = new ObservableCollection<ObjT>();
/* Lista di oggetti, è la proprietà con cui si effettua il Binding con gli
* elementi della ListView. */
public ObservableCollection<ObjT> ListOfObject
{
get
{ return list; }
}
// Metodo che inizializza la lista
private void InitList()
{
list.Add(new ObjT { Name = "Marco", Age = 24, Graduate = true });
list.Add(new ObjT { Name = "Nadia", Age = 18 });
list.Add(new ObjT { Name = "Davide", Age = 21, Graduate = true });
list.Add(new ObjT { Name = "Valentina", Age = 24, Graduate = true, Music = eMusic.Pop });
list.Add(new ObjT { Name = "Orazio", Age = 54, Graduate = true, Music = eMusic.Classic });
list.Add(new ObjT { Name = "Carolina", Age = 51, Graduate = true, Music = eMusic.Pop });
list.Add(new ObjT { Name = "Federico", Age = 17 });
list.Add(new ObjT { Name = "Francesco", Age = 10, Music = eMusic.Pop });
list.Add(new ObjT { Name = "Valentina", Age = 23, Graduate = true, Music = eMusic.Pop });
/* Forse sarebbe più chiaro ed efficiente avere differenti
* ObservableCollection<T> e specificare per ognuna che tipo di ordinamento
* dev'essere fatto una volta che la lista è stata instanziata, ma
* dipende da cosa dovete fare. */
//var sorted = CollectionViewSource.GetDefaultView(ListOfObject);
//sorted.SortDescriptions.Add(new SortDescription("Age", ListSortDirection.Ascending));
}
// Evento catturato quando viene selezionato un tab diverso
private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
/* Ricrea una lista ordinata solo se il metodo è stato chiamato quando
* è stato selezionato un TabControl.
* Questo metodo dev'essere riscritto a seconda delle vostre necessità. */
if (e.OriginalSource is TabControl && !TabByGroup.IsSelected)
{
IList<ObjT> sorted = null;
if (TabByAge.IsSelected)
sorted = list.OrderBy(obj => obj.Age).ToList();
else if (TabByName.IsSelected)
sorted = list.OrderBy(obj => obj.Name).ToList();
list.Clear();
foreach (ObjT obj in sorted)
list.Add(obj);
}
else if (e.OriginalSource is ListView)
{
ListView view = e.OriginalSource as ListView;
ItemContainerGenerator generator = view.ItemContainerGenerator;
ListViewItem item = generator.ContainerFromIndex(view.SelectedIndex) as ListViewItem;
}
}
// Doppio click sulla lista ordinata per età, modifica il colore della riga
private void SetDblClickColor(object sender, RoutedEventArgs e)
{
(sender as ListViewItem).Background = Brushes.LightPink;
}
// Rimuove il relativo elemento della lista
private void QuitBtn_Click(object sender, RoutedEventArgs e)
{
ObjT data = (sender as Button).DataContext as ObjT;
list.Remove(data);
}
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs args)
{
}
}
}