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

Posted

技术标签:

【中文标题】在uwp中向数据网格添加新行时如何自动开始编辑?【英文标题】:How to automatically begin editing when adding a new row to a datagrid in uwp? 【发布时间】:2019-10-30 10:32:34 【问题描述】:

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

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

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

提前致谢

【问题讨论】:

如果您查看WindowsCommunityToolkit 源代码,您就会知道这是设计使然。您可以在Github 上提交您的“功能请求”。 @XavierXie 这是支持的,只是不直观。 【参考方案1】:

我在 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 事件将我的数据模型保存回磁盘。

【讨论】:

以上是关于在uwp中向数据网格添加新行时如何自动开始编辑?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle APEX交互式网格新行不可编辑

如何在控制台中向已打印的表中添加新行?

如何在 wpf 中将新行添加到数据网格中?

如何在 devexpress 中向表单字段添加动态验证规则

创建新行时的剑道网格,使用现有行中的值自动填充字段

添加新行时自动插入日期戳