我有一个像这样的数据网格:
<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)在我开始编辑后立即制作这个新的空行?
这是起点:
这是在双击空白行并编辑后:
完成编辑后,会出现一个新的空白行:
但这就是我想要的(编辑时新的空白行):
答案 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