我有一个绑定到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
当我按照上面的示例初始化datagrid时,将其绑定到Observable集合上并将项目添加到绑定的集合中,不会触发任何事件。我很好奇为什么这些事件没有被解雇?
绑定似乎可以,因为项目已正确添加到数据网格中。
EDIT2
我知道有关通知事件和可观察到的集合,但是看着这个我只能访问ViewModel类。但是我要说的是,当用户添加新行时,该行将切换到“编辑”模式,并且用户可以写入其单元格。而不是双击它。
所以这就是为什么我尝试使用这两个事件。因为在单元格上有引用时,我可以调用BeginEdit https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.datagrid.beginedit?view=netframework-4.7.2