Tuesday, 15 May 2012

Windows 8 Metro - GridView ItemClick Command Attached Property

Windows 8 Metro doesn't support triggers, so it's not easy to bind commands to events in the view any more. This is an attached property which can be attached to a GridView to bind a command to the ItemClick event:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace AAWP.Commanding
    public class GridViewItemClickCommand
        public static readonly DependencyProperty CommandProperty =
            DependencyProperty.RegisterAttached("Command", typeof(ICommand), typeof(GridViewItemClickCommand), new PropertyMetadata(null, CommandPropertyChanged));

        public static void SetCommand(DependencyObject attached, ICommand value)
            attached.SetValue(CommandProperty, value);

        public static ICommand GetCommand(DependencyObject attached)
            return (ICommand)attached.GetValue(CommandProperty);

        private static void CommandPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
            // Attach click handler
            (d as GridView).ItemClick += gridView_ItemClick;

        private static void gridView_ItemClick(object sender, ItemClickEventArgs e)
            // Get GridView
            var gridView = (sender as GridView);

            // Get command
            ICommand command = GetCommand(gridView);

            // Execute command


                AutomationProperties.Name="Grouped Items"
                ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}"
                ItemTemplate="{StaticResource Standard250x250ItemTemplate}"
                cmd:GridViewItemClickCommand.Command="{Binding ItemClickCommand}" >