添加新项目后立即添加新行

时间:2013-11-19 19:24:21

标签: 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集合中。但是,在完成编辑之前不会显示新的空白行(即按Enter按钮或选择新的行/列)。有没有办法(最好不违反MVVM)在我开始编辑后立即制作这个新的空行?

这是起点:

Starting Point

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

Editing

完成编辑后,会出现一个新的空白行:

New Blank Line

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

New Blank Line While Editing

2 个答案:

答案 0 :(得分:2)

要获得所需的行为,您需要将事件与数据网格的 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());
}

由于您要绑定到集合,因此您必须向集合中添加新项目,而不是直接向数据网格添加新项目。由于您使用的是 ObservableCollection ,因此应自动更新以反映新行。

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

答案 1 :(得分:0)

我找到了解决方案。可能您可能想保留单元格编辑焦点,以便可以使用 dataGrid.CommitEdit(DataGridEditingUnit.Row, false );

在这里看看:

Add blank row to WPF DataGrid right after new item has been added