我知道WPF datagrid有“RowEditEnding”事件,但是我需要在Row编译之后触发事件,以检查新添加的行是否重复并合并重复的行。我的datagrid将“CanUserAddRow”属性设置为True。
我正在使用EntityObservableCollection扩展ObservableCollection以使我的实体与集合同步。所以,我考虑过OnCollectionChanged事件,但是一旦用户点击新项目占位符行,就会引发“InsertItem”事件,这意味着该对象仍然是空的,我无法检查是否有重复。
无论如何我可以举起RowEditEnded事件吗?
...谢谢
答案 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中的更改是否实际上是对原始值的更改时,我遇到了同样的问题。此活动符合我的需求。
希望我能告诉你一些新东西。