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>
或将CellTemplate
中DatePicker
的IsEnabled
属性设为false
。无论哪种方式,您都必须通过双击单元格进入编辑模式,然后才能期待 CellEditEnding
事件触发。
在 MyDatagrid_CellEditEnding(...)
事件(如下所示)中,每当用户编辑三列之一的单元格时,我都会捕获单元格的编辑值。在第二列或第三列中编辑单元格后,当我移出该单元格时,我可以看到 CellEditEnding
事件被调用。但对于 DataGridTemplateColumn
列的第一列,情况并非如此。也就是说,当我更改第一个 DataGridTemplateColumn
中任何单元格中的日期并将光标移出该单元格时,不会调用 CellEditEnding
事件。
问题:我可能在这里遗漏了什么,我们怎样才能让它发挥作用?我在网上看到过类似的问题和他们的解决方案(例如
注意:我在 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>
或将CellTemplate
中DatePicker
的IsEnabled
属性设为false
。无论哪种方式,您都必须通过双击单元格进入编辑模式,然后才能期待 CellEditEnding
事件触发。