WPF Datagrid行编辑“ENDED”事件

时间:2010-10-14 22:17:46

标签: wpf wpfdatagrid observablecollection

我知道WPF datagrid有“RowEditEnding”事件,但是我需要在Row编译之后触发事件,以检查新添加的行是否重复并合并重复的行。我的datagrid将“CanUserAddRow”属性设置为True。

我正在使用EntityObservableCollection扩展ObservableCollection以使我的实体与集合同步。所以,我考虑过OnCollectionChanged事件,但是一旦用户点击新项目占位符行,就会引发“InsertItem”事件,这意味着该对象仍然是空的,我无法检查是否有重复。

无论如何我可以举起RowEditEnded事件吗?

...谢谢

8 个答案:

答案 0 :(得分:25)

    private void dgrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
    {
        if (this.dgrid.SelectedItem != null)
        {
            (sender as DataGrid).RowEditEnding -=dgrid_RowEditEnding;
            (sender as DataGrid).CommitEdit();
            (sender as DataGrid).Items.Refresh();
            (sender as DataGrid).RowEditEnding += dgrid_RowEditEnding;
        }
        else Return;

       //then check if the newly added row is duplicated
    }

答案 1 :(得分:2)

我使用VS2010找到了你的问题的答案

条件如果RowEditEnding中的(e.EditAction == DataGridEditAction.Commit)将满足您的要求

请参阅以下代码。

private void dataGrid1_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
{
    if (e.EditAction == DataGridEditAction.Commit)
    {
        MessageBox.Show("asd");
    }
}

这是Xaml Behind。

<DataGrid AutoGenerateColumns="False" CanUserAddRows="True" Height="241" 
    RowEditEnding="dataGrid1_RowEditEnding" HorizontalAlignment="Left" 
    Name="dataGrid1" VerticalAlignment="Top" Width="573" >
    <DataGrid.Columns>
        <DataGridTextColumn Header="name" Binding="{Binding id}" 
            Width="300">
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

答案 2 :(得分:1)

从@ MaherBenIssa的回答中,我用这个来避免添加和删除委托:

    private bool locker = true;

    private void dgArticles_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
    {
        if (locker)
        {
            try{
                locker = false;
                (sender as DataGrid).CommitEdit(DataGridEditingUnit.Row, false);
                ((sender as FrameworkElement).DataContext as ViewModel)?.Edit(e.Row.DataContext);
            }
            finally{
               locker = true; //enable editing again
            }
        }
    }

答案 3 :(得分:0)

尝试为您的数据网格设置CommitEdit()函数。我在这里用它:

private void DataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
    this.MyDataGrid.CommitEdit(DataGridEditingUnit.Row, false);
}

答案 4 :(得分:0)

我想知道你为什么要找到引发RowEditEnded事件的方法; 如果你实现datagrid的RowEditEnding事件;无论何时编辑一行并从该行更改焦点,该行都将被提交并且将引发RowEditEnding;

所以在Row提交之后RowEditEnding将被引发并像RowEditEnded一样工作;

我的文字中有什么不妥吗?

答案 5 :(得分:0)

VB.NET解决@MaherBenIssa的解决方案

Private Sub dgLayer_RowEditEnding(sender As Object, e As DataGridRowEditEndingEventArgs)

    Dim d As DataGrid
    d = DirectCast(sender, DataGrid)

    RemoveHandler d.RowEditEnding, AddressOf dgLayer_RowEditEnding

    dgLayer.CommitEdit()
    sender.Items.Refresh()

    AddHandler d.RowEditEnding, AddressOf dgLayer_RowEditEnding

End Sub

答案 6 :(得分:0)

您可以对数据网格的属性成员绑定使用UpdateSourceTrigger=PropertyChanged。这将确保在CellEditEnding被触发时,更新已经反映在可观察集合中。 看到这篇文章https://stackoverflow.com/a/27239243/9285072

答案 7 :(得分:0)

也许您可以使用事件“ CurrentCellChanged”。当您也开始编辑单元格时,就会触发此操作,但是也许您可以找到一种方法,使自己不总是执行方法中想做的所有事情。

当我想检查datagrid中的更改是否实际上是对原始值的更改时,我遇到了同样的问题。此活动符合我的需求。

希望我能告诉你一些新东西。