Событие 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>