diff --git a/src/Avalonia.Controls.DataGrid/DataGrid.cs b/src/Avalonia.Controls.DataGrid/DataGrid.cs
index 83a0dd3ce1..81715e022b 100644
--- a/src/Avalonia.Controls.DataGrid/DataGrid.cs
+++ b/src/Avalonia.Controls.DataGrid/DataGrid.cs
@@ -4152,6 +4152,7 @@ namespace Avalonia.Controls
if (exitEditingMode)
{
+ CurrentColumn.EndCellEditInternal();
_editingColumnIndex = -1;
editingCell.UpdatePseudoClasses();
diff --git a/src/Avalonia.Controls.DataGrid/DataGridColumn.cs b/src/Avalonia.Controls.DataGrid/DataGridColumn.cs
index f7df3d493a..d1e1efdd85 100644
--- a/src/Avalonia.Controls.DataGrid/DataGridColumn.cs
+++ b/src/Avalonia.Controls.DataGrid/DataGridColumn.cs
@@ -800,11 +800,22 @@ namespace Avalonia.Controls
protected internal virtual void RefreshCellContent(Control element, string propertyName)
{ }
+ ///
+ /// When overridden in a derived class, called when a cell in the column exits editing mode.
+ ///
+ protected virtual void EndCellEdit()
+ { }
+
internal void CancelCellEditInternal(Control editingElement, object uneditedValue)
{
CancelCellEdit(editingElement, uneditedValue);
}
+ internal void EndCellEditInternal()
+ {
+ EndCellEdit();
+ }
+
///
/// Coerces a DataGridLength to a valid value. If any value components are double.NaN, this method
/// coerces them to a proper initial value. For star columns, the desired width is calculated based
diff --git a/src/Avalonia.Controls.DataGrid/DataGridTemplateColumn.cs b/src/Avalonia.Controls.DataGrid/DataGridTemplateColumn.cs
index 24ae358dcc..516e9cf6c2 100644
--- a/src/Avalonia.Controls.DataGrid/DataGridTemplateColumn.cs
+++ b/src/Avalonia.Controls.DataGrid/DataGridTemplateColumn.cs
@@ -55,17 +55,25 @@ namespace Avalonia.Controls
get => _cellEditingCellTemplate;
set => SetAndRaise(CellEditingTemplateProperty, ref _cellEditingCellTemplate, value);
}
-
- private static void OnCellTemplateChanged(AvaloniaPropertyChangedEventArgs e)
+
+ private bool _forceGenerateCellFromTemplate;
+
+ protected override void EndCellEdit()
{
- var oldValue = (IDataTemplate)e.OldValue;
- var value = (IDataTemplate)e.NewValue;
+ //the next call to generate element should not resuse the current content as we need to exit edit mode
+ _forceGenerateCellFromTemplate = true;
+ base.EndCellEdit();
}
protected override Control GenerateElement(DataGridCell cell, object dataItem)
{
if (CellTemplate != null)
{
+ if (_forceGenerateCellFromTemplate)
+ {
+ _forceGenerateCellFromTemplate = false;
+ return CellTemplate.Build(dataItem);
+ }
return (CellTemplate is IRecyclingDataTemplate recyclingDataTemplate)
? recyclingDataTemplate.Build(dataItem, cell.Content as Control)
: CellTemplate.Build(dataItem);