我有这样的数据网格:
<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)在我开始编辑后立即制作这个新的空白行?
这是出发点:
这是在双击空白行并编辑后:
完成编辑后,会出现一个新的空白行:
但这是我想要的(编辑时新的空白行):
最佳答案 要获得所需的行为,您需要将事件连接到datagrid的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,因此它应自动更新以反映新行.
但是,这会导致您在集合中总是有额外的东西,这可能是您不想要的.