Сетка данных не запускает события AddingNewItem или InitializingNewItem - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть сетка данных, привязанная к наблюдаемой коллекции. При нажатии кнопки добавляется новая строка, и я хочу начать редактирование новой строки, как только она будет добавлена. Для этого я хочу использовать 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)
{

}

EDIT Я использую компонент DataGrid, который должен иметь событие AddingNewItem и InitializingNewItem 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

Когда я инициализирую сетку данных, как в примере выше, привязываем его к коллекции Observable и добавляем элемент в связанную коллекцию, ни одно из этих событий не запускается. И мне любопытно, почему эти события не проводятся?

С привязкой все в порядке, потому что элемент правильно добавлен в сетку данных.

EDIT2

Я знаю о событиях уведомления и наблюдаемых коллекциях, но при просмотре я могу получить доступ только к классу ViewModel. Но я хочу сказать, что когда пользователь добавляет новую строку, эта строка переключается в режим редактирования, и пользователь может записывать в свои ячейки. Вместо двойного щелчка по нему.

Так вот почему я пытаюсь использовать эти два события. Потому что, когда у меня есть ссылка на ячейку, я могу вызвать BeginEdit https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.datagrid.beginedit?view=netframework-4.7.2

...