首页 > 解决方案 > DataGrid CellEditEnding 事件未在 DataGridTemplateColumn 内的单元格编辑上触发

问题描述

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

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

注意:我使用的是VS2019最新.NET Core 3.1版本Windows 10 vs1903 - Pro

<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;
}

标签: c#wpfdatagridwpf-core

解决方案


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

DatePickerin替换CellTemplateTextBlock

<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>

或者设置to中的IsEnabled属性。无论哪种方式,您都必须通过双击单元格进入编辑模式,然后才能期望事件触发。DatePickerCellTemplatefalseCellEditEnding


推荐阅读