时间:2011-01-06 17:33:12

标签: c# wpf datagrid

7 个答案:

答案 0 :(得分:10)

您要查找的活动是DataGrid.AddingNewItem event。此事件将允许您根据需要配置新对象,然后将其应用于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">

代码背后:

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

答案 1 :(得分:8)

答案 2 :(得分:8)

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

XAML

<DataGrid ... 
          RowEditEnding="MyDataGrid_RowEditEnding">
</DataGrid>

背后的代码

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)所有。我的尊重。

答案 3 :(得分:2)

我添加这个因为我花了将近2个小时试图找出当你绑定到一组视图模型时如何让DataGrid添加一个新行,你需要控制那些视图模型的构建。

因此,设置是您拥有绑定到DataGrid的ObservableCollection<MyViewModel>的{​​{1}}。您需要在视图模型层中自己创建ItemsSource

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

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

答案 4 :(得分:0)

我发现DataGrid_InitializingNewItem事件对您很有帮助,您可以在其中检查e.NewItem并根据其类型采取适当的操作。

答案 5 :(得分:0)

对于通过AddingNewItem绑定添加的项目,将触发DataGrid.LoadingRow Event(自.Net 4.0起可用)。

答案 6 :(得分:0)

在您的XAML中,在Window标记中包含以下代码:

<input type="submit" value="View Report" id="save" name="save" data-reportid="108">
    

接下来,在您的DataGrid元素内,添加以下触发器:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:cmd="http://www.galasoft.ch/mvvmlight"

接下来,在视图模型中,添加用于处理事件的命令:

<DataGrid ...>

  <i:Interaction.Triggers>
        <i:EventTrigger EventName="LoadingRow">
               <cmd:EventToCommand Command="{Binding LoadRowHandler}" 
                                                PassEventArgsToCommand="True"/>
         </i:EventTrigger>                        
   </i:Interaction.Triggers>

</DataGrid>

在内部构造函数中,初始化命令:

public RelayCommand<DataGridRowEventArgs> LoadRowHandler{ get; private set; }

接下来,创建一个要放置逻辑的方法:

LoadRowHandler = new RelayCommand<DataGridRowEventArgs>(LoadingRowHandlerMethod);

仅此而已。现在,每当将新行添加到DataGrid时,就会执行LoadingRowHandlerMethod。

希望有帮助。