diff --git a/src/Avalonia.Controls.DataGrid/DataGrid.cs b/src/Avalonia.Controls.DataGrid/DataGrid.cs
index ab1aff9220..9d231ff8b2 100644
--- a/src/Avalonia.Controls.DataGrid/DataGrid.cs
+++ b/src/Avalonia.Controls.DataGrid/DataGrid.cs
@@ -4489,17 +4489,27 @@ namespace Avalonia.Controls
element = dataGridColumn.GenerateEditingElementInternal(dataGridCell, dataGridRow.DataContext);
if (element != null)
{
- // Subscribe to the new element's events
- element.Initialized += EditingElement_Initialized;
+
+ dataGridCell.Content = element;
+ if (element.IsInitialized)
+ {
+ PreparingCellForEditPrivate(element as Control);
+ }
+ else
+ {
+ // Subscribe to the new element's events
+ element.Initialized += EditingElement_Initialized;
+ }
}
}
else
{
// Generate Element and apply column style if available
element = dataGridColumn.GenerateElementInternal(dataGridCell, dataGridRow.DataContext);
+ dataGridCell.Content = element;
}
- dataGridCell.Content = element;
+
}
private void PreparingCellForEditPrivate(Control editingElement)
diff --git a/src/Avalonia.Controls.DataGrid/DataGridDataConnection.cs b/src/Avalonia.Controls.DataGrid/DataGridDataConnection.cs
index a94acdec57..fade597ca1 100644
--- a/src/Avalonia.Controls.DataGrid/DataGridDataConnection.cs
+++ b/src/Avalonia.Controls.DataGrid/DataGridDataConnection.cs
@@ -233,7 +233,7 @@ namespace Avalonia.Controls
else
{
editableCollectionView.EditItem(dataItem);
- return editableCollectionView.IsEditingItem;
+ return editableCollectionView.IsEditingItem || editableCollectionView.IsAddingNew;
}
}
@@ -314,7 +314,14 @@ namespace Avalonia.Controls
CommittingEdit = true;
try
{
- editableCollectionView.CommitEdit();
+ if (editableCollectionView.IsAddingNew)
+ {
+ editableCollectionView.CommitNew();
+ }
+ else
+ {
+ editableCollectionView.CommitEdit();
+ }
}
finally
{
diff --git a/src/Avalonia.Visuals/Visual.cs b/src/Avalonia.Visuals/Visual.cs
index 2c96d87bb6..322b630e83 100644
--- a/src/Avalonia.Visuals/Visual.cs
+++ b/src/Avalonia.Visuals/Visual.cs
@@ -489,11 +489,8 @@ namespace Avalonia
protected internal sealed override void LogBindingError(AvaloniaProperty property, Exception e)
{
- // Don't log a binding error unless the control is attached to a logical or visual tree.
- // In theory this should only need to check for logical tree attachment, but in practise
- // due to ContentControlMixin only taking effect when the template has finished being
- // applied, some controls are attached to the visual tree before the logical tree.
- if (((ILogical)this).IsAttachedToLogicalTree || ((IVisual)this).IsAttachedToVisualTree)
+ // Don't log a binding error unless the control is attached to a logical tree.
+ if (((ILogical)this).IsAttachedToLogicalTree)
{
if (e is BindingChainException b &&
string.IsNullOrEmpty(b.ExpressionErrorPoint) &&
diff --git a/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj b/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj
index 32f90d5cbf..c4c1f49346 100644
--- a/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj
+++ b/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj
@@ -14,6 +14,7 @@
+
diff --git a/tests/Avalonia.Base.UnitTests/Logging/LoggingTests.cs b/tests/Avalonia.Base.UnitTests/Logging/LoggingTests.cs
new file mode 100644
index 0000000000..d160713023
--- /dev/null
+++ b/tests/Avalonia.Base.UnitTests/Logging/LoggingTests.cs
@@ -0,0 +1,73 @@
+using Avalonia.Controls;
+using Avalonia.Controls.Shapes;
+using Avalonia.Markup.Xaml;
+using Avalonia.UnitTests;
+using Xunit;
+
+namespace Avalonia.Base.UnitTests.Logging
+{
+ public class LoggingTests
+ {
+ [Fact]
+ public void Control_Should_Not_Log_Binding_Errors_When_Detached_From_Visual_Tree()
+ {
+ using (UnitTestApplication.Start(TestServices.StyledWindow))
+ {
+ var xaml = @"
+
+
+
+
+";
+
+ var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
+ var calledTimes = 0;
+ using var logSink = TestLogSink.Start((l, a, s, m, d) =>
+ {
+ if (l >= Avalonia.Logging.LogEventLevel.Warning)
+ {
+ calledTimes++;
+ }
+ });
+ var panel = window.FindControl("panel");
+ var rect = window.FindControl("rect");
+ window.ApplyTemplate();
+ window.Presenter.ApplyTemplate();
+ panel.Children.Remove(rect);
+ Assert.Equal(0, calledTimes);
+ }
+ }
+
+ [Fact]
+ public void Control_Should_Log_Binding_Errors_When_No_Ancestor_With_Such_Name()
+ {
+ using (UnitTestApplication.Start(TestServices.StyledWindow))
+ {
+ var xaml = @"
+
+
+
+
+";
+ var calledTimes = 0;
+ using var logSink = TestLogSink.Start((l, a, s, m, d) =>
+ {
+ if (l >= Avalonia.Logging.LogEventLevel.Warning && s is Rectangle)
+ {
+ calledTimes++;
+ }
+ });
+ var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
+ window.ApplyTemplate();
+ window.Presenter.ApplyTemplate();
+ Assert.Equal(1, calledTimes);
+ }
+ }
+ }
+
+
+}