In this article I will shows how to create a ListView that allows multiple items to be selected, in other words users can select more than one item, just like adding mulitple items to a shopping cart.
Here I use a ListView control and bind data to it. When the user selects the items it allows them to select more than one item at a time.
Here is the procedure to be followed.
Step 1
Create a Blank Windows Store App using XAML and C#.
Step 2
Here is the XAML markup of creating the Listview:
<Page
x:Class="MasterDetailViewUsingListView.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MasterDetailViewUsingListView"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<Grid Height="500">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ListView x:Name="ItemListView" Margin="0,0,0,8" Width="Auto" Height="Auto" BorderThickness="0" VerticalAlignment="Stretch" HorizontalAlignment="Left"
ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Disabled" SelectionMode="Multiple">
<ListView.ItemsPanel>
<ItemsPanelTemplate >
<StackPanel Margin="0,0,0,0" Width="Auto"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate>
<Grid HorizontalAlignment="Stretch" Width="Auto" Height="Auto" Margin="20,0,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Border Margin="0,8,0,8" Width="50" Height="50" HorizontalAlignment="Left" VerticalAlignment="Center">
<Image Source="{Binding Image}" Margin="0" Stretch="Fill"/>
</Border>
<StackPanel Grid.Column="1" HorizontalAlignment="Left" Margin="10,8,0,0">
<TextBlock Text="{Binding Title}" FontSize="25" Width="400"/>
</StackPanel>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<StackPanel Orientation="Horizontal" Grid.Column="1">
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
<Button x:Name="AddToCart" Content="Add to cart" Click="AddToCart_Click"/>
</StackPanel>
<TextBlock x:Name="ShoppingCart" Text="" Width="300" FontSize="20" TextWrapping="Wrap" Margin="0,10,0,0"/>
</StackPanel>
</Grid>
</Grid>
</Page>
Step 3
For selecting multiple items, set the selectionMode property to Multiple, as in:
SelectionMode="Multiple"
Step 4
In this article I use custom classes to create the data source. The following is the code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Media.Imaging;
namespace MasterDetailViewUsingListView
{
public class ItemDetails
{
public ItemDetails()
{
Item item;
Uri _baseUri = new Uri("ms-appx:///");
item = new Item();
item.Title = "Acer Aspire S3-391 Laptop";
item.Price = "Rs. 66,754";
item.SetImage(_baseUri, "Images/1.jpg");
item.Content = "Core i7 (3G), 13.3 Inch4, GB RAM, 500 GB HD, Win 7";
item = new Item();
item.Title = "Acer Aspire S3 Aspire S Laptop";
item.Price = "Rs. 54,500";
item.SetImage(_baseUri, "Images/2.jpg");
item.Content = "Core i5 (2G), 13.3 Inch, 4 GB RAM, 320 GB HD, Win 7";
Collection.Add(item);
item = new Item();
item.Title = "Acer Aspire One 725 Laptop";
item.Price = "Rs. 19,499";
item.SetImage(_baseUri, "Images/3.jpg");
item.Content = "AMD APU Dual Core, 11.6 Inch, 2 GB RAM, 320 GB HD, Win 7";
Collection.Add(item);
item = new Item();
item.Title = "Acer Aspire One AOD 270 NU.SGASI.003 Netbook";
item.Price = "Rs. 16,560";
item.SetImage(_baseUri, "Images/4.jpg");
item.Content = "Atom Dual Core (2G), 10.1 Inch, 2 GB RAM, 320 GB HD, Linux";
Collection.Add(item);
item = new Item();
item.Title = "Acer Aspire V3-571G Laptop";
item.Price = "Rs. 38,455";
item.SetImage(_baseUri, "Images/6.jpg");
item.Content = "Core i3 (2G), 15.6 Inch, 4 GB RAM, 500 GB HD, Win 7";
Collection.Add(item);
}
List<Item> collection = new List<Item>();
public List<Item> Collection
{
get
{
return this.collection;
}
}
}
}
public class Item
{
private string _Title = string.Empty;
public string Title
{
get
{
return this._Title;
}
set
{
this._Title = value;
}
}
private string _Price = string.Empty;
public string Price
{
get
{
return this._Price;
}
set
{
this._Price = value;
}
}
private ImageSource _Image = null;
public ImageSource Image
{
get
{
return this._Image;
}
set
{
this._Image = value;
}
}
public void SetImage(Uri baseUri, String path)
{
Image = new BitmapImage(new Uri(baseUri, path));
}
private string _Link = string.Empty;
public string Link
{
get
{
return this._Link;
}
set
{
this._Link = value;
}
}
private string _Category = string.Empty;
public string Category
{
get
{
return this._Category;
}
set
{
this._Category = value;
}
}
private string _Description = string.Empty;
public string Description
{
get
{
return this._Description;
}
set
{
this._Description = value;
}
}
private string _Content = string.Empty;
public string Content
{
get
{
return this._Content;
}
set
{
this._Content = value;
}
}
}
Here is the code to set the data source to the ListView:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
ItemDetails messageData = new ItemDetails();
ItemListView.ItemsSource = messageData.Collection;
ItemListView.SelectedIndex = 0;
}
Step 5
The code of the Button's Click when multiple items are selected is as follows:
void AddToCart_Click(object sender, RoutedEventArgs e)
{
char[] charsToTrim = { ',', ' ' };
if (ItemListView.SelectedItems.Count != 0)
{
foreach (Item item in ItemListView.SelectedItems)
{
ShoppingCart.Text += item.Title + ", ";
}
ShoppingCart.Text = ShoppingCart.Text.TrimEnd(charsToTrim);
ShoppingCart.Text += " added to cart";
}
}
Step 6
Now, run the application to see the output. Select the multiple items from the ListView and click on the Add to Cart button.
Output