Datagrid未触发AddingNewItem或InitializingNewItem事件

时间:2019-04-12 05:39:23

标签: c# .net wpf wpfdatagrid

我有一个绑定到observablecollection的datagrid。通过单击按钮添加新行,并且我要在添加新行后立即开始编辑新行。为此,我想使用 AddingNewItem InitializingNewItem 事件,因为我认为我可以访问此事件中新添加的行并对其进行调用BeginInit(或类似的操作)

但是在类似波纹管的代码中,我无法使事件起作用。当我添加新项目时,不会触发事件。我想念什么吗?

<DataGrid Margin="5"
          AddingNewItem="enumerationsDataGrid_AddingNewItem"
          AutoGenerateColumns="False"
          InitializingNewItem="enumerationsDataGrid_InitializingNewItem"
          ItemsSource="{Binding TypesAllAvailable}"
          RowDetailsVisibilityMode="Collapsed">

    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Expander x:Name="rowDetailsExpander"
                              Cursor="Hand"
                              IsExpanded="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}, Mode=FindAncestor}, Mode=TwoWay, Path=DetailsVisibility, Converter={StaticResource visToBoolConverter}}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn Width="0.7*"
                            Binding="{Binding TypeName}"
                            Header="Name" />
        <DataGridTextColumn Width="0.2*"
                            Binding="{Binding Enumerations.Count}"
                            Header="Enums"
                            IsReadOnly="True" />
        <DataGridTextColumn Width="0.7*"
                            Binding="{Binding Parent.Name}"
                            Header="Scope"
                            IsReadOnly="True" />
    </DataGrid.Columns>
    <DataGrid.RowDetailsTemplate>
        <DataTemplate>
            <StackPanel>
                <DataGrid x:Name="enumerationsDataGrid"
                          Margin="5 0 5 5"
                          AddingNewItem="enumerationsDataGrid_AddingNewItem"
                          AutoGenerateColumns="false"
                          ItemsSource="{Binding Enumerations}"
                          SizeChanged="enumerationsDataGrid_SizeChanged">
                    <DataGrid.RowStyle>
                        <Style BasedOn="{StaticResource MetroDataGridRow}"
                               TargetType="DataGridRow">

                            <Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext}" />
                            <Setter Property="ContextMenu">
                                <Setter.Value>
                                    <ContextMenu>

                                        <MenuItem Command="{Binding PlacementTarget.Tag.RemoveEnumerationValueCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
                                                  CommandParameter="{Binding}"
                                                  Header="_Delete enumeration" />
                                    </ContextMenu>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </DataGrid.RowStyle>
                    <DataGrid.Columns>
                        <DataGridTextColumn Binding="{Binding Name}"
                                            Header="Enumerations" />

                    </DataGrid.Columns>
                </DataGrid>
                <TextBlock Margin="5 0 5 5"
                           HorizontalAlignment="Center"
                           Foreground="Black"
                           Text="No enumerations found."
                           Visibility="{Binding Items.IsEmpty, Converter={StaticResource bool2VisibilityConverter}, ElementName=enumerationsDataGrid}" />
                <Button Width="110"
                        Margin="5 0 0 5"
                        HorizontalAlignment="Left"
                        Command="{Binding AddEnumerationValueCommand}"
                        CommandParameter="{Binding}"
                        Content="New enumeration" />
            </StackPanel>
        </DataTemplate>
    </DataGrid.RowDetailsTemplate>
    <DataGrid.RowStyle>
        <Style BasedOn="{StaticResource MetroDataGridRow}"
               TargetType="DataGridRow">
            <!--<Setter Property="DetailsVisibility" Value="{Binding ElementName=rowDetailsExpander}, Path=IsExpanded}" /> -->
            <Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Path=DataContext}" />
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu>
                        <MenuItem Command="{Binding Parent.RemoveStateTypeCommand}"
                                  CommandParameter="{Binding}"
                                  Header="_Delete state" />
                        <!--  Command="{Binding PlacementTarget.Tag.DeleteObjectiveStateCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}"  -->
                    </ContextMenu>
                </Setter.Value>
            </Setter>
        </Style>
    </DataGrid.RowStyle>
</DataGrid>

事件在相同的UserControl中,断点未击中...

private void enumerationsDataGrid_AddingNewItem(object sender, AddingNewItemEventArgs e)
{

}

private void enumerationsDataGrid_InitializingNewItem(object sender, InitializingNewItemEventArgs e)
{

}

编辑 我正在使用应该具有事件 AddingNewItem InitializingNewItem 的DataGrid组件 https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.datagrid.addingnewitem?view=netframework-4.7.2

https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.datagrid.initializingnewitem?view=netframework-4.7.2

当我按照上面的示例初始化datagrid时,将其绑定到Observable集合上并将项目添加到绑定的集合中,不会触发任何事件。我很好奇为什么这些事件没有被解雇?

绑定似乎可以,因为项目已正确添加到数据网格中。

EDIT2

我知道有关通知事件和可观察到的集合,但是看着这个我只能访问ViewModel类。但是我要说的是,当用户添加新行时,该行将切换到“编辑”模式,并且用户可以写入其单元格。而不是双击它。

所以这就是为什么我尝试使用这两个事件。因为在单元格上有引用时,我可以调用BeginEdit https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.datagrid.beginedit?view=netframework-4.7.2

0 个答案:

没有答案