Silverlight: spostare elementi

Oggi voglio presentarti un controllino Silverlight di input che permette di selezionare un elemento e di spostarlo all'interno di una lista. Elementi usati sono una classe semplicissima che ci fa da sorgente e un ListBox al quale abbiamo personalizzato il template dei singoli item (elementi) e creato il binding (via XAML).

Lo XAML di base è veramente banale: una griglia di layout e uno stack panel per i pulsantini di movimento:

<UserControl x:Class="ItemPresenterTest.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<Grid x:Name="LayoutRoot" Background="White">
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<ListBox x:Name="control" Grid.Column="0">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Nome}" Width="100"/>
<TextBlock Text="{Binding Path=Cognome}" Width="100"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListBox>
<StackPanel Orientation="Vertical" Grid.Column="1">
<Button x:Name="btUp" Content="UP" Width="50" VerticalAlignment="Stretch"></Button>
<Button x:Name="btDown" Content="DOWN" Width="50" VerticalAlignment="Stretch"></Button>
</StackPanel>
</Grid>
</UserControl>

 

Nel .cs (code behind) la classe anagrafica che si chiama Ana, la creazione del source, quindi gli eventi sui pulsanti: i metodi potevano essere ottimizzati, ma li ho tenuti "estesi" per migliorarne la comprensione:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace ItemPresenterTest
{
public partial class MainPage : UserControl
{
public class Ana
{
public string Nome { get; set; }
public string Cognome { get; set; }
 public Ana(string nome, string cognome)
{
this.Nome = nome;
this.Cognome = cognome;
}
}
 List<Ana> lista;
 public MainPage()
{
InitializeComponent();
 lista = new List<Ana>();
lista.Add(new Ana("Riccardo", "XXX"));
lista.Add(new Ana("Tiziana", "YYY"));
lista.Add(new Ana("Ruomerta", "ZZZ"));
lista.Add(new Ana("Gigio", "QQQ"));
lista.Add(new Ana("Samuele", "HHH"));
lista.Add(new Ana("Mirco", "WWW"));
control.ItemsSource = lista;
//bottoni
btUp.Click += new RoutedEventHandler(btUp_Click);
btDown.Click += new RoutedEventHandler(btDown_Click);
}
void btDown_Click(object sender, RoutedEventArgs e)
{
if (control.SelectedItem != null)
{
if (control.SelectedIndex < control.Items.Count-1 )
{
int i = control.SelectedIndex + 1;
Ana succ = (Ana)control.Items[i];
Ana curr = (Ana)control.SelectedItem;
lista[i] = curr;
lista[i - 1] = succ;
//refresh lista
control.ItemsSource = null;
control.ItemsSource = lista;
control.SelectedIndex = i;
}
}
}
void btUp_Click(object sender, RoutedEventArgs e)
{
if (control.SelectedItem != null) {
if (control.SelectedIndex > 0) {
int i = control.SelectedIndex - 1;
Ana prec = (Ana)control.Items[i];
Ana curr = (Ana)control.SelectedItem;
lista[i] = curr;
lista[i + 1] = prec;
//refresh lista
control.ItemsSource = null;
control.ItemsSource = lista;
control.SelectedIndex = i;
}
}
}
}
}

Tutto chiaro? Al massimo fate uno squillo. Se volete, basta che me lo chiedete, posso estendere l'esempio mostrandovi come aumentare le funzionalità del controllo, defininendo l'itemPresenter come elemento esterno, anche in CS puro!

Loading Facebook Comments ...

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *