WPF Datagrid 行编辑“ENDED”事件

Posted

技术标签:

【中文标题】WPF Datagrid 行编辑“ENDED”事件【英文标题】:WPF Datagrid Row Editing "ENDED" event 【发布时间】:2011-04-25 16:20:12 【问题描述】:

我知道 WPF 数据网格有 "RowEditEnding" 事件,但我需要在 Row 提交后触发该事件以检查新添加的行是否重复并合并重复的行。我的数据网格将“CanUserAddRow”属性设置为 True。

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

无论如何我可以引发 RowEditEnded 事件吗?

谢谢...

【问题讨论】:

可能有一些验证事件。你可以检查一下。 您是否真的尝试对 CollectionChanged 进行足够的了解?内部检查可以让您知道项目何时实际插入或更新,因此您可以每次检查以及是否填写了字段然后执行更改逻辑:***.com/questions/4587448/collectionchanged-sample。在我意识到这种方法的局限性(切换句柄然后强制提交和刷新等)之前,我投票赞成 @Mah,并且对 collectionchanged 进行了更多思考(但现在不能删除投票) 【参考方案1】:
    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
    

【讨论】:

这应该被选为接受的答案。谢谢马赫·本·伊萨! 它非常适合我,但这是最好的答案吗?这是优化的代码吗? 还有另一个问题 CellEndEdit 我对 CellEndEdit 有同样的问题。 我同意@Jo-Smo:这应该是公认的答案。 msdn 建议使用调度程序来延迟调用刷新函数。这有效,但感觉很慢。我在下面的代码中发布了 vb.net 通讯员。 我爱你!你救了我,这应该是正确答案【参考方案2】:

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

【讨论】:

【参考方案3】:

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

RowEditEnding 中的条件 if (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>

【讨论】:

【参考方案4】:

取自@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
            
        
    

【讨论】:

【参考方案5】:

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

private void DataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)

    this.MyDataGrid.CommitEdit(DataGridEditingUnit.Row, false);

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

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

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

【讨论】:

【参考方案8】:

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

所以在 Row 提交后,RowEditEnding 将被提升并像 RowEditEnded 一样工作;

我是否从您的文字中理解了错误?

【讨论】:

以上是关于WPF Datagrid 行编辑“ENDED”事件的主要内容,如果未能解决你的问题,请参考以下文章

获取wpf datagrid单元格编辑事件

Datagrid行选择事件,WPF

WPF Datagrid 模板列编辑事件和交替列颜色

WPF datagrid 选择行点击事件?

WPF datagrid:禁用某些行中的编辑

WPF DataGrid常用属性记录