我有一个这样的数据网格:
<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 的方法)在我开始编辑后立即显示这个新的空白行?
这是起点:
这是在双击空白行并编辑之后:
当我完成编辑时,会出现一个新的空行:
但这就是我想要的(编辑时新的空白行):
最佳答案
要获得您想要的行为,您需要将一个事件连接到数据网格的 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/