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 e ObservableCollection * * List: è 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: è 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 list = new ObservableCollection(); /* Lista di oggetti, è la proprietà con cui si effettua il Binding con gli * elementi della ListView. */ public ObservableCollection 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 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 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) { } } }