WPF数据网格行编辑";完";事件

WPF数据网格行编辑";完";事件,wpf,wpfdatagrid,observablecollection,Wpf,Wpfdatagrid,Observablecollection,我知道WPF datagrid有“RowEditEnding”事件,但我需要在该行出现后启动该事件,以检查新添加的行是否重复,并合并重复的行。我的datagrid的“CanUserAddRow”属性设置为True 我正在使用EntityObservableCollection扩展ObservableCollection以使我的实体与集合同步。因此,我考虑了OnCollectionChanged事件,但“InsertItem”事件是在用户单击新项目占位符行时引发的,这意味着该对象仍然为空,我无法检

我知道WPF datagrid有“RowEditEnding”事件,但我需要在该行出现后启动该事件,以检查新添加的行是否重复,并合并重复的行。我的datagrid的“CanUserAddRow”属性设置为True

我正在使用EntityObservableCollection扩展ObservableCollection以使我的实体与集合同步。因此,我考虑了OnCollectionChanged事件,但“InsertItem”事件是在用户单击新项目占位符行时引发的,这意味着该对象仍然为空,我无法检查是否存在重复项

我是否可以提出RowEditEnded事件

谢谢…

尝试为您的datagrid设置committedit()函数。我在这里用过:

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

我想知道你为什么要想办法举办这场盛会; 如果实现datagrid的RowEditEnding事件;无论何时编辑一行并更改该行的焦点,都将提交该行并引发RowEditEnding

因此,行提交后,将引发RowEditEnding,并与RowEditEnded一样工作


我从你的文本中理解了什么错误吗?

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

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

请参阅下面的代码

private void dataGrid1_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
{
    if (e.EditAction == DataGridEditAction.Commit)
    {
        MessageBox.Show("asd");
    }
}
这就是背后的Xaml

<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>

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

Private子dgLayer_RowEditEnding(发送方作为对象,e作为DataGridRowEditEndingEventArgs)
数据网格
d=DirectCast(发送方,数据网格)
RemoveHandler d.RowEditEnding,dgLayer_RowEditEnding的地址
dgLayer.committedit()
sender.Items.Refresh()
AddHandler d.RowEditEnding,dgLayer_RowEditEnding的地址
端接头

根据@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
            }
        }
    }

您可以对datagrid的属性成员的绑定使用
UpdateSourceTrigger=PropertyChanged
。这将确保当触发
CellEditEnding
时,更新已反映在可观察的集合中。
请参阅本文,也许您可以使用事件“CurrentCellChanged”。当您开始编辑单元格时也会触发此命令,但也许您可以找到一种方法,使您不必总是在方法中执行所有您想执行的操作

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


希望我能告诉你一些新的事情。

可能有一些验证事件。你可以检查一下。你真的试着看够CollectionChanged了吗?内部检查可以让您知道项目实际插入或更新的时间,所以您可以每次检查字段是否已填写,然后执行更改逻辑:。在意识到该方法的局限性(切换句柄,然后强制提交和刷新等)之前,我对@Mah进行了升级投票,并对collectionchanged进行了更多思考(但现在无法删除升级投票),这应该被选为可接受的答案。谢谢Maher Ben Issa!这对我来说非常有效,但这是最好的答案吗?这是一个优化的代码吗?还有一个关于CellEndEdit的问题,我对CellEndEdit也有同样的问题。我同意@Jo Smo:这应该是公认的答案。建议对refresh函数的延迟调用使用dispacher。这可以工作,但感觉很慢。我把vb.net通讯员发到下面上面的代码。我爱你!你救了我,这应该是正确的答案
    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
            }
        }
    }