arti
arti

Reputation: 657

How to get ListView SelectedItem while editing?

I'm trying to save record when combination of keys pressed Ctrl + S. Below code works fine only when i exit TextBox and select line then press Ctrl + S. How to SelectItem without exiting TextBox? For example: typing text >> Ctrl + S >> continue typing. Here is my code:

        if (Keyboard.IsKeyDown(Key.LeftCtrl) && Keyboard.IsKeyDown(Key.S))
        {
            sql.saveSoftwareChanges(_list.SelectedItem as Software);
            e.Handled = true;
        }

and XAML:

            <ListView x:Name="_list" Visibility="Visible" KeyDown="_list_KeyDown">

            <!--RESOURCES-->
            <ListView.Resources>
                <Style TargetType="ListViewItem">
                    <Style.Triggers>
                        <Trigger Property="IsKeyboardFocusWithin" Value="true">
                            <Setter Property="IsSelected" Value="true" />
                        </Trigger>

                        <Trigger Property="IsSelected" Value="true">
                            <Setter Property="Background" Value="#FFFFFF9A" />
                        </Trigger>

                    </Style.Triggers>
                </Style>
            </ListView.Resources>
            <!--/RESOURCES-->

            <ListView.View>
                <GridView>

                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Button x:Name="_save" Content="Save" MinWidth="20" Width="AUTO" Click="_save_Click" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                    <GridViewColumn Header="Product ID">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Text="{Binding productId}" MinWidth="20" Width="AUTO" Padding="2"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                    <GridViewColumn Header="Product">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Text="{Binding product}" MinWidth="20" Width="AUTO" Padding="2"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                     </GridViewColumn>

                    <GridViewColumn Header="Path">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Text="{Binding path}" MinWidth="20" Width="AUTO" Padding="2"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                    <GridViewColumn Header="Master Path">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Text="{Binding master_path}" MinWidth="20" Width="AUTO" Padding="2"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                    <GridViewColumn Header="Parameters">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Text="{Binding parameters}" MinWidth="20" Width="AUTO" Padding="2"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                    <GridViewColumn Header="Windows Version">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Text="{Binding windowsVersion}" MinWidth="20" Width="AUTO" Padding="2"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                </GridView>
            </ListView.View>
        </ListView>

Upvotes: 1

Views: 65

Answers (2)

arti
arti

Reputation: 657

After a lot of research and trial and error I've got the solution. It's as simple as moving out of that field, which can be achieved by:

MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));

and entire method looks like:

        if (Keyboard.IsKeyDown(Key.LeftCtrl) && Keyboard.IsKeyDown(Key.S))
        {
            var uie = e.OriginalSource as UIElement;
            uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            sql.saveSoftwareChanges(_list.SelectedItem as Software);

            uie.Focus();
            e.Handled = true;
        }

I hope that will help others as well.

Upvotes: 1

Emad
Emad

Reputation: 3929

You have to place your save code in a function then call this function from any control that may have the focus at that time. (i.e. the text box as well). Remember that keyboard events only fire when the corresponding control has focus.

Test this:

<ListView x:Name="_list" Visibility="Visible" KeyDown="_list_KeyDown">

        <!--RESOURCES-->
        <ListView.Resources>
            <Style TargetType="ListViewItem">
                <Style.Triggers>
                    <Trigger Property="IsKeyboardFocusWithin" Value="true">
                        <Setter Property="IsSelected" Value="true" />
                    </Trigger>

                    <Trigger Property="IsSelected" Value="true">
                        <Setter Property="Background" Value="#FFFFFF9A" />
                    </Trigger>

                </Style.Triggers>
            </Style>
        </ListView.Resources>
        <!--/RESOURCES-->

        <ListView.View>
            <GridView>

                <GridViewColumn>
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <Button x:Name="_save" Content="Save" MinWidth="20" Width="AUTO" Click="_save_Click" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

                <GridViewColumn Header="Product ID">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding productId}" MinWidth="20" Width="AUTO" Padding="2" KeyDown="_list_KeyDown"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

                <GridViewColumn Header="Product">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding product}" MinWidth="20" Width="AUTO" Padding="2" KeyDown="_list_KeyDown"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                 </GridViewColumn>

                <GridViewColumn Header="Path">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding path}" MinWidth="20" Width="AUTO" Padding="2" KeyDown="_list_KeyDown"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

                <GridViewColumn Header="Master Path">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding master_path}" MinWidth="20" Width="AUTO" Padding="2" KeyDown="_list_KeyDown"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

                <GridViewColumn Header="Parameters">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding parameters}" MinWidth="20" Width="AUTO" Padding="2" KeyDown="_list_KeyDown"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

                <GridViewColumn Header="Windows Version">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding windowsVersion}" MinWidth="20" Width="AUTO" Padding="2" KeyDown="_list_KeyDown"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

            </GridView>
        </ListView.View>
    </ListView>

Upvotes: 0

Related Questions