WPF DataGrid - 新行的事件?

cod*_*ike 7 c# wpf datagrid

我正在使用WPF DataGrid(Toolkit中的.Net 3.5 SP 1版本)

我可以订阅什么事件来检测何时添加新行?(例如,当用户向下移动光标或按Enter键时,新的空白行将添加到网格中).

最终我想要做的是使用该事件来计算一些默认值并将它们放在新行中.

网格绑定到a DataTable,如果这有任何区别.

day*_*neo 12

您正在寻找的事件是DataGrid.AddingNewItem事件.此事件将允许您根据需要配置新对象,然后将其应用于AddingNewItemEventArgs的NewItem属性.

XAML:

        <DataGrid Name="GrdBallPenetrations"
              ItemsSource="{Binding BallPenetrationCollection}" 
              SelectedItem="{Binding CurrentSelectedBallPenetration}"
              AutoGenerateColumns="False" 
              IsReadOnly="False"
              CanUserAddRows="True"
              CanUserDeleteRows="True"
              IsSynchronizedWithCurrentItem="True"
              AddingNewItem="GrdBallPenetrations_AddingNewItem">
Run Code Online (Sandbox Code Playgroud)

代码背后:

private void GrdBallPenetrations_AddingNewItem(object sender, AddingNewItemEventArgs e)
    {
        e.NewItem = new BallPenetration
        {
            Id              = Guid.NewGuid(),
            CarriageWay     = CariageWayType.Plus,
            LaneNo          = 1,
            Position        = Positions.BetweenWheelTracks
        };
    }
Run Code Online (Sandbox Code Playgroud)

  • 我只是想到,我要提到,直到.Net 4.5才能使用这个版本,对于那些仍在使用旧版本的.Net框架的人来说. (2认同)
  • 如果通过“ItemsSource”绑定添加项目,则不会触发“AddingNewItem”事件。 (2认同)

Cal*_*iff 8

当用户离开他正在编辑的行时,对象将被持久化(插入或更新).移动到同一行中的另一个单元格通过数据绑定更新相应的属性,但尚未发信号通知模型(或数据访问层).唯一有用的事件是DataGrid.RowEditEnding.这是在提交修改的行之前触发的.

XAML

<DataGrid ... 
          RowEditEnding="MyDataGrid_RowEditEnding">
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

代码背后

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...
    } 
}
Run Code Online (Sandbox Code Playgroud)

该解决方案的所有学分都归Diederik Krolls(Original Post)所有.我的尊敬.


Ree*_*sey 7

我建议不要在视图(网格)中处理事件,而是建议观察绑定对象,然后将逻辑放在那里.这可以使您的业务逻辑业务对象保持一致.

既然你被束缚了DataTable,最简单的方法就是订阅DataTable.TableNewRow.

  • 我完全同意.这将为您提供更多灵活性.例如,将来的某一天您可能需要一种自定义方式来添加新行而不是使用数据网格.在这种情况下,所有内容都已经到位,因为您只关心将新对象添加到您的集合中...您可以更少关注它的添加方式. (2认同)

bri*_*ler 5

我添加这个是因为我刚刚花了近 2 个小时试图弄清楚当您绑定到视图模型集合并且需要控制这些视图模型的构造时如何让 DataGrid 添加新行。

因此,设置是您有一个ObservableCollection<MyViewModel>绑定到ItemsSourceDataGrid 的。您需要MyViewModel在视图模型层中创建自己。

这就是 DataGrid 自动添加行时的工作方式:

  1. 当它在底部创建空白行时,它会创建一个新实例,该实例MyViewModel将通过调用该类型的默认构造函数绑定到该行。谁知道它为什么这样做,但如果MyViewModel没有默认构造函数,它将无法显示该空白行。这可能是您陷入困境的地方,因为您没有默认构造函数,因为您需要自己创建对象。不幸的是,您需要去添加一个。再次注意,如果元素类型是接口,这注定会失败。集合的元素类型必须是具有默认构造函数的具体类。
  2. 现在它会等到用户编辑该行,此时它会开始正确添加。
  3. 它引发AddingNewItem:您可以在此处拦截添加操作并切换它使用您自己的实例创建的默认构造函数创建的实例。它AddingNewItemEventArgs.NewItem有一个设置器,您可以将当前项目交换为您自己的项目。