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”事件的主要内容,如果未能解决你的问题,请参考以下文章