diff --git a/Avalonia.sln.DotSettings b/Avalonia.sln.DotSettings
index 2c0a6b9dc8..b0692905e7 100644
--- a/Avalonia.sln.DotSettings
+++ b/Avalonia.sln.DotSettings
@@ -1,5 +1,4 @@
- True
ExplicitlyExcluded
ExplicitlyExcluded
ExplicitlyExcluded
@@ -39,4 +38,4 @@
<Policy Inspect="False" Prefix="" Suffix="" Style="AaBb" />
True
True
- True
\ No newline at end of file
+ True
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index fbd8507193..11ef36d43f 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -1,7 +1,7 @@
jobs:
- job: Linux
pool:
- vmImage: 'ubuntu-16.04'
+ vmImage: 'ubuntu-20.04'
steps:
- task: CmdLine@2
displayName: 'Install Nuke'
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.Controls/Presenters/ScrollContentPresenter.cs b/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs
index e3783febdd..b0b52812b9 100644
--- a/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs
+++ b/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs
@@ -511,8 +511,8 @@ namespace Avalonia.Controls.Presenters
else if (scrollable.IsLogicalScrollEnabled)
{
Viewport = scrollable.Viewport;
- Offset = scrollable.Offset;
Extent = scrollable.Extent;
+ Offset = scrollable.Offset;
}
}
diff --git a/src/Markup/Avalonia.Markup.Xaml/Extensions.cs b/src/Markup/Avalonia.Markup.Xaml/Extensions.cs
index fe3fd44c1c..263750c316 100644
--- a/src/Markup/Avalonia.Markup.Xaml/Extensions.cs
+++ b/src/Markup/Avalonia.Markup.Xaml/Extensions.cs
@@ -2,7 +2,9 @@ using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
+using Avalonia.Controls;
using Avalonia.Markup.Xaml.XamlIl.Runtime;
+using Avalonia.Styling;
namespace Avalonia.Markup.Xaml
{
@@ -32,5 +34,26 @@ namespace Avalonia.Markup.Xaml
string name = string.IsNullOrEmpty(namespacePrefix) ? type : $"{namespacePrefix}:{type}";
return tr?.Resolve(name);
}
+
+ public static object GetDefaultAnchor(this IServiceProvider provider)
+ {
+ // If the target is not a control, so we need to find an anchor that will let us look
+ // up named controls and style resources. First look for the closest IControl in
+ // the context.
+ object anchor = provider.GetFirstParent();
+
+ if (anchor is null)
+ {
+ // Try to find IDataContextProvider, this was added to allow us to find
+ // a datacontext for Application class when using NativeMenuItems.
+ anchor = provider.GetFirstParent();
+ }
+
+ // If a control was not found, then try to find the highest-level style as the XAML
+ // file could be a XAML file containing only styles.
+ return anchor ??
+ provider.GetService()?.RootObject as IStyle ??
+ provider.GetLastParent();
+ }
}
}
diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/CompiledBindingExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/CompiledBindingExtension.cs
index 17d2ea7ae9..41de2355aa 100644
--- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/CompiledBindingExtension.cs
+++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/CompiledBindingExtension.cs
@@ -1,7 +1,5 @@
using System;
using Avalonia.Data;
-using Avalonia.Controls;
-using Avalonia.Styling;
using Avalonia.Markup.Xaml.MarkupExtensions.CompiledBindings;
using Avalonia.Data.Core;
using Avalonia.Markup.Parsers;
@@ -33,24 +31,10 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions
Priority = Priority,
StringFormat = StringFormat,
Source = Source,
- DefaultAnchor = new WeakReference(GetDefaultAnchor(provider))
+ DefaultAnchor = new WeakReference(provider.GetDefaultAnchor())
};
}
- private static object GetDefaultAnchor(IServiceProvider provider)
- {
- // If the target is not a control, so we need to find an anchor that will let us look
- // up named controls and style resources. First look for the closest IControl in
- // the context.
- object anchor = provider.GetFirstParent();
-
- // If a control was not found, then try to find the highest-level style as the XAML
- // file could be a XAML file containing only styles.
- return anchor ??
- provider.GetService()?.RootObject as IStyle ??
- provider.GetLastParent();
- }
-
protected override ExpressionObserver CreateExpressionObserver(IAvaloniaObject target, AvaloniaProperty targetProperty, object anchor, bool enableDataValidation)
{
if (Source != null)
diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ReflectionBindingExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ReflectionBindingExtension.cs
index 10770365a3..d373ed852a 100644
--- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ReflectionBindingExtension.cs
+++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ReflectionBindingExtension.cs
@@ -37,33 +37,12 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions
Source = Source,
StringFormat = StringFormat,
RelativeSource = RelativeSource,
- DefaultAnchor = new WeakReference(GetDefaultAnchor(descriptorContext)),
+ DefaultAnchor = new WeakReference(descriptorContext.GetDefaultAnchor()),
TargetNullValue = TargetNullValue,
NameScope = new WeakReference(serviceProvider.GetService())
};
}
- private static object GetDefaultAnchor(IServiceProvider context)
- {
- // If the target is not a control, so we need to find an anchor that will let us look
- // up named controls and style resources. First look for the closest IControl in
- // the context.
- object anchor = context.GetFirstParent();
-
- if(anchor is null)
- {
- // Try to find IDataContextProvider, this was added to allow us to find
- // a datacontext for Application class when using NativeMenuItems.
- anchor = context.GetFirstParent();
- }
-
- // If a control was not found, then try to find the highest-level style as the XAML
- // file could be a XAML file containing only styles.
- return anchor ??
- context.GetService()?.RootObject as IStyle ??
- context.GetLastParent();
- }
-
public IValueConverter Converter { get; set; }
public object ConverterParameter { get; set; }