在uwp中向数据网格添加新行时,如何自动开始编辑?

时间:2019-06-16 17:14:13

标签: c# uwp datagrid focus windows-community-toolkit

我有一个社区工具包datagrid绑定到一个可观察的集合。我还有一个绑定到命令的“添加”按钮,该命令向集合添加新元素,从而向数据网格添加新行。现在,我想在单击按钮时自动开始编辑新行的第一个单元格。 我尝试将其添加到命令末尾:

MyDataGrid.Focus(FocusState.Programmatic);
MyDataGrid.SelectedIndex = MyCollection.Count;
MyDataGrid.CurrentColumn = MyDataGrid.Columns[0];
MyDataGrid.BeginEdit();

这仅在单击按钮之前焦点已经位于数据网格上时有效。有谁知道如何解决这个问题?

预先感谢

1 个答案:

答案 0 :(得分:0)

我在XAML Studio中针对设置中的已知名称空间进行了此操作。这是绑定到DataGrid的ItemsSource的ObservableCollection

除了具有用于添加操作的按钮并将代码放入其回调之外,您还需要在DataGrid上为PreparingCellForEdit事件添加事件处理程序。

因此,在您的add方法中,您可以在集合中创建一个新元素,然后像这样开始编辑新项目:

        private void AddNamespaceButton_Click(object sender, RoutedEventArgs e)
        {
            // Add new Row and begin editing
            KnownNamespaces.Insert(0, new XmlnsNamespace(string.Empty, string.Empty));

            NamespaceDataGrid.SelectedIndex = 0;

            NamespaceDataGrid.ScrollIntoView(NamespaceDataGrid.SelectedItem, null);

            NamespaceDataGrid.Focus(FocusState.Keyboard);

            NamespaceDataGrid.BeginEdit();
        }

下一部分是DataGridTextColumn类型的键,以确保在编辑时将单元格的焦点转移到TextBox内部的焦点:


        private void NamespaceDataGrid_PreparingCellForEdit(object sender, Microsoft.Toolkit.Uwp.UI.Controls.DataGridPreparingCellForEditEventArgs e)
        {
            if (e.EditingElement is TextBox t)
            {
                t.Focus(FocusState.Keyboard);
            }
        }

请务必注意,ObservableCollection所组成的类应实现IEditableObject接口以与DataGrid一起正常工作。


为了完整性,这是我的XAML:

<StackPanel Margin="{StaticResource SettingsSubheaderMargin}">
                        <StackPanel Orientation="Horizontal">
                            <TextBlock x:Uid="SettingsPanel_KnownNamespaces"
                                       Margin="0,8,0,12"
                                       Style="{StaticResource BodyTextStyle}" />
                            <Button x:Uid="SettingsPanel_KnownNamespaces_Button_Add" Click="AddNamespaceButton_Click" Style="{StaticResource VSCodeAppBarHeaderButtonStyle}">
                                <SymbolIcon Symbol="Add" />
                            </Button>
                        </StackPanel>
                        <controls:DataGrid x:Name="NamespaceDataGrid"
                                           MaxHeight="450"
                                           AutoGenerateColumns="False"
                                           Background="{ThemeResource Brush-Blue-Dark-1}"
                                           CanUserReorderColumns="False"
                                           CanUserSortColumns="True"
                                           IsReadOnly="False"
                                           ItemsSource="{x:Bind KnownNamespaces, Mode=OneWay}"
                                           PreparingCellForEdit="NamespaceDataGrid_PreparingCellForEdit"
                                           RowEditEnded="DataGrid_RowEditEnded">
                            <controls:DataGrid.Columns>
                                <controls:DataGridTextColumn Width="SizeToCells"
                                                             Binding="{Binding Name}"
                                                             FontSize="20"
                                                             Header="Shortcut" />
                                <controls:DataGridTextColumn Width="SizeToCells"
                                                             Binding="{Binding Path}"
                                                             FontSize="20"
                                                             Header="Namespace" />
                                <controls:DataGridTemplateColumn>
                                    <controls:DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <Button x:Uid="SettingsPanel_KnownNamespaces_Button_Remove"
                                                    Click="RemoveNamespaceButton_Click"
                                                    CommandParameter="{Binding}"
                                                    Style="{StaticResource VSCodeAppBarHeaderButtonStyle}">
                                                <SymbolIcon Symbol="Delete" />
                                            </Button>
                                        </DataTemplate>
                                    </controls:DataGridTemplateColumn.CellTemplate>
                                </controls:DataGridTemplateColumn>
                            </controls:DataGrid.Columns>
                        </controls:DataGrid>
                    </StackPanel>

我使用RowEditEnding事件将数据模型保存回磁盘。