Событие DataGrid CellEditEnding не запускается при редактировании ячейки внутри DataGridTemplateColumn

В MyDatagrid_CellEditEnding(...)событие (показано ниже) Я фиксирую отредактированное значение ячейки всякий раз, когда ячейка одного из трех столбцов редактируется пользователем. После редактирования ячейки во втором или третьем столбце, когда я выхожу из этой ячейки, я вижуCellEditEndingсобытие вызывает. Но это неверно для первого столбца, который являетсяDataGridTemplateColumnстолбец. То есть, когда я меняю дату в любой ячейке первойDataGridTemplateColumn, и переместите курсор из ячейки, CellEditEnding событие не называется.

Вопрос: Что мне здесь может не хватать и как это сделать? Я видел похожие проблемы и их решения в Интернете (например, this и this), поэтому я не уверен, что мне здесь не хватает.

Примечание. Я использую последние версии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;
}

2 ответа

Решение

Вы редактируете DatePicker в CellTemplate и это не вызывает CellEditEndingсобытие для пожара. ВCellTemplate не должен содержать никаких элементов управления вводом.

Заменить DatePicker в CellTemplate с 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>

Или установите IsEnabled собственность DatePicker в CellTemplate к false. В любом случае вам придется войти в режим редактирования, дважды щелкнув ячейку, прежде чем вы сможете ожидатьCellEditEnding событие для пожара.

Попробуй это:

<DataGridTemplateColumn.CellEditingTemplate>
   <DataTemplate>
      <DatePicker SelectedDate="{Binding DateModified, UpdateSourceTrigger=LostFocus}" BorderThickness="0" />
   </DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
Другие вопросы по тегам