WPF DataGrid设置CanUserAddRows=True无法添加空行及方向键控制问题咨询
问题1:DataGrid无法显示新增空行解决方案
出现该问题的核心原因有两个,按以下步骤修改即可解决:
- 你没有给DataGrid绑定
ItemsSource属性,虽然后台给DataContext赋值了集合,但DataGrid不会自动将DataContext作为数据源,需要手动绑定 - WPF DataGrid自动新增行需要绑定的实体类拥有公共无参构造函数,用于创建新的行实例
代码修改
1. 调整XAML DataGrid定义
添加ItemsSource绑定:
<DataGrid x:Name="UrunGrid" Grid.Row="0" CanUserAddRows="True" ItemsSource="{Binding}" AlternatingRowBackground="LightGray" AlternationCount = "2" AutomationProperties.IsOffscreenBehavior="Offscreen"> <!-- 原有列定义保持不变 --> <DataGrid.Columns> <DataGridTextColumn Header="ISBN/Barkod" Binding="{Binding BARCODE}"/> <DataGridTextColumn Header="Ürün Açıklaması" Binding="{Binding PRODUCT_NAME}"/> <DataGridTextColumn Header="Adet" Binding="{Binding QUANTITY}"/> <DataGridTextColumn Header="ISK" Binding="{Binding DISCOUNT}"/> <DataGridTextColumn Header="KDV" Binding="{Binding TAX}"/> <DataGridTextColumn Header="Birim Fiyat" Binding="{Binding PURCHASE_PRICE}"/> <DataGridTextColumn Header="Tutar" Binding="{Binding AMOUNT}"/> </DataGrid.Columns> </DataGrid>
2. 给Invoice实体类添加无参构造函数
class Invoice { // 新增公共无参构造函数 public Invoice() { // 可选:给属性设置默认值避免绑定警告 PRODUCT_NAME = string.Empty; } public Int64 BARCODE { get; set; } public string PRODUCT_NAME { get; set; } public int QUANTITY{ get; set; } public int DISCOUNT{ get; set; } public int TAX{ get; set; } public int PURCHASE_PRICE { get; set; } public int AMOUNT { get; set; } public static ObservableCollection<Invoice> getInvoice() { var invoice = new ObservableCollection<Invoice>(); return invoice; } }
问题2:方向键控制DataGrid操作实现
WPF DataGrid默认已经支持方向键上下切换行、左右切换单元格,如果需要自定义方向键行为,可以通过绑定PreviewKeyDown事件实现,以下是示例实现:
- 先在XAML中给DataGrid添加事件绑定:
<DataGrid x:Name="UrunGrid" <!-- 原有属性保持不变 --> PreviewKeyDown="UrunGrid_PreviewKeyDown">
- 后台添加事件处理逻辑:
private void UrunGrid_PreviewKeyDown(object sender, KeyEventArgs e) { // 示例1:按回车键跳转到下一个单元格,替代默认换行行为 if (e.Key == Key.Enter) { var currentElement = e.OriginalSource as UIElement; if (currentElement != null) { e.Handled = true; currentElement.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); } } // 示例2:在最后一行按向下键时自动新增一行 else if (e.Key == Key.Down && UrunGrid.SelectedIndex == UrunGrid.Items.Count - 1) { var invoiceCollection = UrunGrid.ItemsSource as ObservableCollection<Invoice>; if (invoiceCollection != null) { invoiceCollection.Add(new Invoice()); UrunGrid.SelectedIndex = invoiceCollection.Count - 1; e.Handled = true; } } // 可根据业务需求扩展其他方向键的自定义逻辑 }
内容的提问来源于stack exchange,提问作者user16126459
相关产品推荐
相关产品推荐

