You need to enable JavaScript to run this app. WPF DataGrid设置CanUserAddRows=True无法添加空行及方向键控制问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

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事件实现,以下是示例实现:

  1. 先在XAML中给DataGrid添加事件绑定:
<DataGrid x:Name="UrunGrid" 
          <!-- 原有属性保持不变 -->
          PreviewKeyDown="UrunGrid_PreviewKeyDown">
  1. 后台添加事件处理逻辑:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 23:27:03