Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在编辑时获取ListView SelectedItem?_C#_Wpf - Fatal编程技术网

C# 如何在编辑时获取ListView SelectedItem?

C# 如何在编辑时获取ListView SelectedItem?,c#,wpf,C#,Wpf,当组合键按下Ctrl+S时,我试图保存记录。 只有当我退出文本框并选择line,然后按Ctrl+S时,下面的代码才能正常工作。 如何在不退出文本框的情况下选择项目?例如:键入文本>>Ctrl+S>>继续键入。 这是我的密码: if (Keyboard.IsKeyDown(Key.LeftCtrl) && Keyboard.IsKeyDown(Key.S)) { sql.saveSoftwareChanges(_list.Se

当组合键按下Ctrl+S时,我试图保存记录。 只有当我退出文本框并选择line,然后按Ctrl+S时,下面的代码才能正常工作。 如何在不退出文本框的情况下选择项目?例如:键入文本>>Ctrl+S>>继续键入。 这是我的密码:

        if (Keyboard.IsKeyDown(Key.LeftCtrl) && Keyboard.IsKeyDown(Key.S))
        {
            sql.saveSoftwareChanges(_list.SelectedItem as Software);
            e.Handled = true;
        }
和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>

您必须将保存代码放入函数中,然后从当时可能具有焦点的任何控件调用此函数。(也就是文本框)。 请记住,键盘事件只有在相应控件具有焦点时才会触发

测试这一点:

<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>

经过大量研究和反复试验,我找到了解决方案。 这很简单,只需离开该领域,可以通过以下方式实现:

MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
整个方法如下所示:

        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;
        }

我希望这也能帮助其他人。

这段代码叫什么?是列表框中的按键事件吗?从ListView中,查看更新的代码请告诉我错误。我认为textbox和listbox的KeyDown事件具有不同的符号,因此不能以这种方式使用它们。没有错误。它只是不保存,它从msql中触发messagebox,使该部分正常工作,但它不会保存它,因为没有任何内容传递给该方法。我遗漏了一些内容。您正在使用Listbox.SelectedItem,它对没有焦点的Listbox不起作用。我能想到的解决方案是使用Listbox.LostFocus事件捕获此时选定的项,然后记录该项并使用该对象调用save函数。记住手动应用objectit排序问题中文本框的当前状态。它捕获整行中的所有更改,但最后编辑的字段除外。