.net 为WPF DataGridRow编写EventTrigger
我想在WPF DataGridRow上写一个触发器,如下所示- 当用户在该行的任何单元格中进行任何更改时,同一行的最后一个单元格应更新为某个特定值.net 为WPF DataGridRow编写EventTrigger,.net,wpf,wpfdatagrid,wpftoolkit,eventtrigger,.net,Wpf,Wpfdatagrid,Wpftoolkit,Eventtrigger,我想在WPF DataGridRow上写一个触发器,如下所示- 当用户在该行的任何单元格中进行任何更改时,同一行的最后一个单元格应更新为某个特定值 请帮助……我不确定这是否可以用触发器来完成 对于基于MVVM的解决方案,您可以将实体更改为实现IEditableObject。当您在DataGrid中提交单元格更改时(例如,关闭或按Enter键),将调用实体的IEditableObject.EndEdit()方法。然后可以更新其中最后一个单元格的绑定属性 (由于某些原因,EndEdit()被调用了两
请帮助……我不确定这是否可以用触发器来完成 对于基于MVVM的解决方案,您可以将实体更改为实现
IEditableObject
。当您在DataGrid中提交单元格更改时(例如,关闭或按Enter键),将调用实体的IEditableObject.EndEdit()
方法。然后可以更新其中最后一个单元格的绑定属性
(由于某些原因,EndEdit()
被调用了两次,这似乎是在将IEditableObject与数据网格一起使用时出现的一个怪癖/错误。问题已经提到)
如果希望在调用IEditableObject.EndEdit()
时对其进行更多控制,可以使用DataGrid RowEditEnding和CellEditEnding事件。例如,以下RowEditEnding
事件处理程序代码将确保仅在提交整行时(而不是在每个单元格提交后)调用实体的EndEdit()方法:-
我发现调用
DataGrid.committedit()
会导致同一事件再次触发,导致堆栈溢出,因此\u是committingedit
变量以阻止这种情况发生。(我很想知道这是不是另一个怪癖或者我做错了什么!)我使用Brian Hinchey在以下链接提供的解决方案解决了我的问题-是否指定了最后一列?换句话说,最后一列中绑定的属性是固定的或不同的?最后一列绑定到同一个实体。我觉得,在这里我们不需要使用grid1.CommittedIt(DataGridEditingUnit.Row,true);我使用以下代码实现了同样的效果-private void DgTeam_RowEditEnding(对象发送方,DataGridRowEditEndingEventArgs e){if(_context.Entry((Team)e.Row.Item).State==EntityState.Modified){((团队)e.Row.Item).Mode=“e”;}}但我正在试图找出是否可以使用xamlI实现这一点。我认为这有点太复杂了,无法通过触发器实现。有时您必须求助于代码隐藏事件处理程序!如果您使用MVVM,并且担心将业务逻辑放在代码后面,它可以调用VM上的方法来设置最后一列值(假设您使用的是“视图优先”,即视图引用了VM)。
private void RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
{
if (_isCommittingEdit || e.EditAction == DataGridEditAction.Cancel)
{
return;
}
if (e.EditAction == DataGridEditAction.Commit)
{
_isCommittingEdit = true;
try
{
grid1.CommitEdit(DataGridEditingUnit.Row, true);
}
finally
{
_isCommittingEdit = false;
}
}
}