c# - 添加新项目后立即添加新行

标签 c# wpf datagrid

我有一个这样的数据网格:

<DataGrid
    ItemsSource="{Binding Things}" 
    AutoGenerateColumns="False">

    <DataGrid.Columns>
        <DataGridTextColumn Header="Whatever" Binding="{Binding Blah}" />
    </DataGrid.Columns>     
</DataGrid>

事物和事物看起来像这样:

public ObservableCollection<Thing> Things { get; set; }

.

public class Thing
{
    public string Blah { get; set; }

    public Thing() { }
}

数据网格的默认行为是在底部以一个新的空行开始。当我开始编辑该行的任何属性时,将创建一个新的 Thing 并将其添加到 Things 集合中。但是,在我完成编辑之前不会显示新的空白行(即按回车按钮或选择新的行/列)。有没有一种方法(最好是不违反 MVVM 的方法)在我开始编辑后立即显示这个新的空白行?

这是起点:

Starting Point

这是在双击空白行并编辑之后:

Editing

当我完成编辑时,会出现一个新的空行:

New Blank Line

但这就是我想要的(编辑时新的空白行):

New Blank Line While Editing

最佳答案

要获得您想要的行为,您需要将一个事件连接到数据网格的 PreparingCellForEdit,只要单元格进入编辑模式,该事件就会被触发.

从此事件中,您可以检查下一行是否存在(当前单元格索引 + 1),如果不存在,则继续并在此时创建它。

我相信这会产生预期的效果,即在您开始编辑单元格时立即添加新行。

例如,PreparingCellForEdit 事件处理程序,每当最后一行开始编辑事件时,这将添加一个新项目(并产生一个新行)。

DataGrid dataGrid = sender as DataGrid;

if (dataGrid == null)
{
    return; 
}

int currentRow = e.Row.GetIndex();

if (dataGrid.Items.Count - 1 <= currentRow)
{
    Things.Add(new Thing());
}

由于您要绑定(bind)到一个集合,因此您必须向该集合添加一个新项,而不是直接向数据网格添加一个新项。由于您使用的是 ObservableCollection,它应该会自动更新以反射(reflect)新行。

但是,这会导致您的收藏中总是有一个您可能不想要的额外 Thing

关于c# - 添加新项目后立即添加新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20080280/

相关文章:

c# - 如何在 WPF 中隐藏 GridViewColumn,就好像它在运行时折叠一样?

c# - 如何在 C# 中获取 .gif 文件的持续时间?

c# - WPF API 能否在 WCF 服务中安全使用?

wpf - 调整特定一侧的边框

wpf - 如何在所有列标题上启用文本换行?

c# - 如何在 C# WPF 中向 Datagrid 添加行

xml - FLEX 数据网格和 XML 列表内容

c# - 对具有不同参数的相同方法调用的最小起订量期望

c# - 无法读取 local.settings.json 中定义的连接字符串

c# - EventQuery 中的 ISA 是什么?