DataGrid CellEditEnding 事件未在 DataGridTemplateColumn 内的单元格编辑上触发

DataGrid CellEditEnding event not firing on a cell editing inside DataGridTemplateColumn

MyDatagrid_CellEditEnding(...) 事件(如下所示)中,每当用户编辑三列之一的单元格时,我都会捕获单元格的编辑值。在第二列或第三列中编辑单元格后,当我移出该单元格时,我可以看到 CellEditEnding 事件被调用。但对于 DataGridTemplateColumn 列的第一列,情况并非如此。也就是说,当我更改第一个 DataGridTemplateColumn 中任何单元格中的日期并将光标移出该单元格时,不会调用 CellEditEnding 事件。

问题:我可能在这里遗漏了什么,我们怎样才能让它发挥作用?我在网上看到过类似的问题和他们的解决方案(例如 and this),所以我不确定我在这里可能遗漏了什么。

注意:我在 Windows 10 vs1903 - Pro

上使用最新版本的 VS2019.NET Core 3.1
<Window x:Class="MyTestApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        .....
        Title="MainWindow">
    <Grid>
        <DataGrid x:Name="MyDatagrid" AutoGenerateColumns="False" SelectionMode="Single" CellEditEnding="MyDatagrid_CellEditEnding">
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="Date Modified">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <DatePicker SelectedDate="{Binding DateModified}" BorderThickness="0" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                   <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <DatePicker SelectedDate="{Binding DateModified}" BorderThickness="0" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
                </DataGridTemplateColumn>
                <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}"/>
                <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}"/>
            </DataGrid.Columns>
        </DataGrid>
        <Button x:Name="btnTest" Content="Test" HorizontalAlignment="Left" VerticalAlignment="Top" Click="btnTest_Click"/>
    </Grid>
</Window>

代码:

......
......
string _sDateModified;
string _sFirstName;
string _sLastName;
.....
.....
private void MyDatagrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
    DataGridColumn c = e.Column;
    if (c.Header.ToString() == "Date Modified")
        _sDateModified = (e.EditingElement as TextBox).Text;
    else if (c.Header.ToString() == "First Name")
        _sFirstName = (e.EditingElement as TextBox).Text;
    else if (c.Header.ToString() == "Last Name")
        _sLastName = (e.EditingElement as TextBox).Text;
}

试试这个:

<DataGridTemplateColumn.CellEditingTemplate>
   <DataTemplate>
      <DatePicker SelectedDate="{Binding DateModified, UpdateSourceTrigger=LostFocus}" BorderThickness="0" />
   </DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>

您正在编辑 CellTemplate 中的 DatePicker,这不会导致触发 CellEditEnding 事件。 CellTemplate 不应包含任何输入控件。

CellTemplate 中的 DatePicker 替换为 TextBlock:

<DataGridTemplateColumn Header="Date Modified">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding DateModified, StringFormat=yyyy-MM-dd}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <DatePicker SelectedDate="{Binding DateModified, UpdateSourceTrigger=LostFocus}" BorderThickness="0" />
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

或将CellTemplateDatePickerIsEnabled属性设为false。无论哪种方式,您都必须通过双击单元格进入编辑模式,然后才能期待 CellEditEnding 事件触发。