立即在添加新项时添加新行

5

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

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

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

Things和Thing看起来像这样:

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

所以如果我理解正确的话,您想在编辑上面的行时,在底部创建一个新行是吗? - Mike Schwartz
我不确定我是否理解您的意思,但您并不希望每一行都自动添加。你只想在编辑完成时才实现这种行为,因为你可能会开始输入一行,然后决定将其丢弃。因此,只有在完成编辑后更改才会应用。 - dev hedgehog
@devhedgehog,你说得很对,如何“放弃这一行”。我个人也不同意这种做法,但我很难想出一个好的理由不这样做。 - ConditionRacer
@MikeSchwartz 正确,一个新的空白行。 - ConditionRacer
@Justin984 我以为你想要的行为是在你编辑完一行后它会被添加。我完全误解了你的意思。现在我知道你是在问是否总是提前一行,对吗? - dev hedgehog
显示剩余4条评论
2个回答

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,这可能并不是您想要的。


不幸的是,我要找的不是要添加到列表中的新项目,而是要添加一个空白行。例如,描述中的第一张和第三张图片都有一个空白行,它们并不对应列表中的项目。这就是我想在编辑开始时显示的内容。 - ConditionRacer
你可能需要修改数据网格模板才能实现这一点,否则我认为唯一的选择是按照描述向列表中添加一个项目,这将导致空行。 - Nathan Dace

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接