WPF Input KeyBinding for a ListBox Item
Asked Answered
W

2

5

I'm having a WPF Application, programatically I'm setting the focus to the ListBox Item, after that using UP / Down arrow I'm navigating from one Item to another Item. I need to Implement ENTER KeyEvent for that appropriate Item, it should trigger the ICommand SelectItemCommand in the ViewModel.

Consider the ViewModel Code:

public class MobileViewModel
{
    public ObservableCollection<Mobile> MobileCollection { get; set; }

    public MobileViewModel()
    {
        MobileCollection = new ObservableCollection<Mobile>()
        {
            new Mobile() { ID = 1, Name = "iPhone 6S", IsSelected = false },
            new Mobile() { ID = 2, Name = "Galaxy S7", IsSelected = false }                        
        }
    }

    public ICommand SelectItemCommand
    {
        get
        {
            return new DelegatingCommand((obj) =>
            {
                // Enter Key Event Operation
            });
        }
    }

}

public class Mobile
{
    public int ID { get; set; }
    public string Name { get; set; }
    public bool IsSelected { get; set; }
}

The XAML Code is

<ListBox ItemsSource="{Binding MobileCollection}" x:Name="KeyListBox">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Button Command="{Binding SelectItemCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MobileViewModel}}}" CommandParameter="{Binding }">
                <Button.InputBindings>
                    <KeyBinding Key="Enter" Command="{Binding SelectItemCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MobileViewModel}}}" CommandParameter="{Binding }" />
                </Button.InputBindings>
                <Button.Content>
                        <StackPanel>
                            <TextBlock Text="{Binding Name}" />
                        </StackPanel>
                </Button.Content>
            </Button>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

My requirement is to trigger the ICommand while on Keyboard ENTER Key hit. I tried the KeyBinding inside the Button, but its not happening. Kindly assist me.

Waterloo answered 16/9, 2016 at 16:37 Comment(0)
L
9

The ListBox Key Binding is

<ListBox.InputBindings>
    <KeyBinding Key="Enter" Command="{Binding DataContext.SelectItemCommand, ElementName=KeyListBox}" 
        CommandParameter="{Binding SelectedItem, 
            RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}}"/>
</ListBox.InputBindings>

You should specify the Element Name and bind using DataContext. Then It should be work

The Complete XAML Source Code is

<ListBox Name="KeyListBox" ItemsSource="{Binding MobileCollection}" HorizontalAlignment="Left" Height="Auto" VerticalAlignment="Top" Width="300" HorizontalContentAlignment="Stretch">

    <ListBox.InputBindings>
        <KeyBinding Key="Enter" Command="{Binding DataContext.SelectItemCommand, ElementName=lstBox}" CommandParameter="{Binding SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}}"/>
    </ListBox.InputBindings>

    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Button Command="{Binding DataContext.SelectItemCommand, ElementName=lstBox}" CommandParameter="{Binding }" Foreground="Black" Padding="12 10" HorizontalContentAlignment="Left">
                    <Button.Content>
                        <StackPanel>
                            <CheckBox IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Foreground="#404040">
                                <CheckBox.Content>
                                    <StackPanel Orientation="Horizontal">
                                        <TextBlock Text="{Binding Name, IsAsync=True}" TextWrapping="Wrap" MaxWidth="270" />
                                    </StackPanel>
                                </CheckBox.Content>
                            </CheckBox>
                        </StackPanel>
                    </Button.Content>
                </Button>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
Lindbom answered 17/9, 2016 at 6:40 Comment(0)
J
2

You could put the InputBinding on the ListBox itself, passing through the selected item as the command parameter.

<ListBox ItemsSource="{Binding MobileCollection}" x:Name="KeyListBox">
    <ListBox.InputBindings>
        <KeyBinding Key="Enter" Command="{Binding SelectItemCommand}" CommandParameter="{Binding SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}}"/>
    </ListBox.InputBindings>

</ListBox>
Jammie answered 16/9, 2016 at 18:22 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.