WPF DataGrid – 新行的事件?
我正在使用WPF DataGrid
( Toolkit中的 .Net 3.5 SP 1版本)
我可以订阅什么事件,以检测何时添加新行? (例如,当用户向下移动光标或按Enter键时,新的空行将添加到网格中)。
最终我想要做的是使用该事件来计算一些默认值并将它们放在新行中。
网格绑定到DataTable
,如果这有任何区别。
我建议不要在视图 (网格)中处理事件,而是建议观察绑定对象,然后将逻辑放在那里。 这可以使您的业务逻辑与业务对象保持一致 。
由于您已绑定到DataTable
,最简单的方法是只订阅DataTable.TableNewRow
。
您正在寻找的事件是DataGrid.AddingNewItem事件 。 此事件将允许您根据需要配置新对象,然后将其应用于AddingNewItemEventArgs的NewItem属性。
XAML:
代码背后:
private void GrdBallPenetrations_AddingNewItem(object sender, AddingNewItemEventArgs e) { e.NewItem = new BallPenetration { Id = Guid.NewGuid(), CarriageWay = CariageWayType.Plus, LaneNo = 1, Position = Positions.BetweenWheelTracks }; }
当用户离开他正在编辑的行时,对象将被持久化(插入或更新)。 移动到同一行中的另一个单元格通过数据绑定更新相应的属性,但尚未发信号通知模型(或数据访问层)。 唯一有用的事件是DataGrid.RowEditEnding。 这是在提交修改的行之前触发的。
XAML
代码背后
private void MyDataGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) { // Only act on Commit if (e.EditAction == DataGridEditAction.Commit) { var newItem = e.Row.DataContext as MyDataboundType; if (newItem is NOT in my bound collection) ... handle insertion... } }
该解决方案的所有学分都归Diederik Krolls( Original Post )所有。 我的尊敬。
我正在添加这个,因为我花了将近2个小时试图找出如何在绑定到视图模型集合时让DataGrid添加新行,并且需要控制这些视图模型的构造。
所以设置是你有一个ObservableCollection
绑定到DataGrid的ItemsSource
。 您需要在视图模型层中自己创建MyViewModel
。
这是DataGrid在自动添加行时的工作方式:
- 当它在底部创建该空行时,它会创建一个新的
MyViewModel
实例,它将通过调用该类型的默认构造函数绑定到该行。 谁知道它为什么这样做,但如果MyViewModel
没有默认构造函数,它将无法显示该空行。 这可能是您被卡住的地方,因为您没有默认构造函数,因为您需要自己创建对象。 不幸的是,你需要去添加一个。 再次注意,如果元素类型是一个接口,那注定要失败。 集合的元素类型必须是具有默认构造函数的具体类。 - 现在它等待用户去编辑行,此时它开始正确添加。
- 它引发了
AddingNewItem
:这是您可以拦截add操作并切换使用您自己的实例创建的默认构造函数创建的实例的地方。AddingNewItemEventArgs.NewItem
有一个setter,你可以交换你自己的当前项目。