在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中向数据网格添加新行时如何自动开始编辑?的主要内容,如果未能解决你的问题,请参考以下文章