diff --git a/.gitignore b/.gitignore
index b5a46e16f4..7d672c7755 100644
--- a/.gitignore
+++ b/.gitignore
@@ -117,6 +117,7 @@ ClientBin/
*.[Pp]ublish.xml
*.pfx
*.publishsettings
+Events_Avalonia.cs
# RIA/Silverlight projects
Generated_Code/
diff --git a/.ncrunch/Avalonia.Controls.UnitTests.net47.v3.ncrunchproject b/.ncrunch/Avalonia.Controls.UnitTests.net47.v3.ncrunchproject
index e9d39b0c74..f30a20df78 100644
--- a/.ncrunch/Avalonia.Controls.UnitTests.net47.v3.ncrunchproject
+++ b/.ncrunch/Avalonia.Controls.UnitTests.net47.v3.ncrunchproject
@@ -3,5 +3,6 @@
MissingOrIgnoredProjectReference
+ Avalonia.Controls.UnitTests.TimePickerTests
\ No newline at end of file
diff --git a/.ncrunch/Sandbox.v3.ncrunchproject b/.ncrunch/Sandbox.v3.ncrunchproject
new file mode 100644
index 0000000000..319cd523ce
--- /dev/null
+++ b/.ncrunch/Sandbox.v3.ncrunchproject
@@ -0,0 +1,5 @@
+
+
+ True
+
+
\ No newline at end of file
diff --git a/Avalonia.sln b/Avalonia.sln
index 922c8f57dd..34ad19b41d 100644
--- a/Avalonia.sln
+++ b/Avalonia.sln
@@ -222,6 +222,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Headless.Vnc", "sr
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Markup.Xaml.Loader", "src\Markup\Avalonia.Markup.Xaml.Loader\Avalonia.Markup.Xaml.Loader.csproj", "{909A8CBD-7D0E-42FD-B841-022AD8925820}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.ReactiveUI.Events", "src\Avalonia.ReactiveUI.Events\Avalonia.ReactiveUI.Events.csproj", "{28F18757-C3E6-4BBE-A37D-11BA2AB9177C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sandbox", "samples\Sandbox\Sandbox.csproj", "{11BE52AF-E2DD-4CF0-B19A-05285ACAF571}"
+EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
src\Shared\RenderHelpers\RenderHelpers.projitems*{3c4c0cb4-0c0f-4450-a37b-148c84ff905f}*SharedItemsImports = 13
@@ -2012,6 +2016,54 @@ Global
{909A8CBD-7D0E-42FD-B841-022AD8925820}.Release|iPhone.Build.0 = Release|Any CPU
{909A8CBD-7D0E-42FD-B841-022AD8925820}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{909A8CBD-7D0E-42FD-B841-022AD8925820}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.AppStore|Any CPU.Build.0 = Debug|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.AppStore|iPhone.Build.0 = Debug|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Release|iPhone.Build.0 = Release|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.AppStore|Any CPU.Build.0 = Release|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.AppStore|iPhone.ActiveCfg = Release|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.AppStore|iPhone.Build.0 = Release|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.Release|Any CPU.Build.0 = Release|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.Release|iPhone.Build.0 = Release|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -2070,6 +2122,7 @@ Global
{351337F5-D66F-461B-A957-4EF60BDB4BA6} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B}
{3C84E04B-36CF-4D0D-B965-C26DD649D1F3} = {A0CC0258-D18C-4AB3-854F-7101680FC3F9}
{909A8CBD-7D0E-42FD-B841-022AD8925820} = {8B6A8209-894F-4BA1-B880-965FD453982C}
+ {11BE52AF-E2DD-4CF0-B19A-05285ACAF571} = {9B9E3891-2366-4253-A952-D08BCEB71098}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {87366D66-1391-4D90-8999-95A620AD786A}
diff --git a/Avalonia.v3.ncrunchsolution b/Avalonia.v3.ncrunchsolution
index bef7e45524..afce1018ec 100644
--- a/Avalonia.v3.ncrunchsolution
+++ b/Avalonia.v3.ncrunchsolution
@@ -6,6 +6,9 @@
src\Avalonia.Build.Tasks\bin\Debug\netstandard2.0\Mono.Cecil.dll
True
+
+ RunApiCompat = false
+
.ncrunch
True
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 54645e461e..721a0415f4 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -35,16 +35,9 @@ jobs:
vmImage: 'macOS-10.14'
steps:
- task: UseDotNet@2
- displayName: 'Use .NET Core SDK 3.1.101'
+ displayName: 'Use .NET Core SDK 3.1.401'
inputs:
- packageType: sdk
- version: 3.1.101
-
- - task: UseDotNet@2
- displayName: 'Use .NET Core Runtime 3.1.1'
- inputs:
- packageType: runtime
- version: 3.1.1
+ version: 3.1.401
- task: CmdLine@2
displayName: 'Install Mono 5.18'
@@ -63,13 +56,6 @@ jobs:
xcodeVersion: '10' # Options: 8, 9, default, specifyPath
args: '-derivedDataPath ./'
- - task: CmdLine@2
- displayName: 'Install CastXML'
- inputs:
- script: |
- brew update
- brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/8a004a91a7fcd3f6620d5b01b6541ff0a640ffba/Formula/castxml.rb
-
- task: CmdLine@2
displayName: 'Install Nuke'
inputs:
@@ -88,7 +74,7 @@ jobs:
export PATH="$PATH:$HOME/.dotnet/tools"
dotnet --info
printenv
- nuke --target CiAzureOSX --configuration Release
+ nuke --target CiAzureOSX --configuration Release --skip-previewer
- task: PublishTestResults@2
inputs:
@@ -112,6 +98,11 @@ jobs:
pool:
vmImage: 'windows-2019'
steps:
+ - task: UseDotNet@2
+ displayName: 'Use .NET Core SDK 3.1.401'
+ inputs:
+ version: 3.1.401
+
- task: CmdLine@2
displayName: 'Install Nuke'
inputs:
diff --git a/build/NetFX.props b/build/NetFX.props
index ed5cb6dd69..8ffc9ec561 100644
--- a/build/NetFX.props
+++ b/build/NetFX.props
@@ -1,7 +1,7 @@
-
+
diff --git a/build/SkiaSharp.props b/build/SkiaSharp.props
index d7d04c7971..f2e7df36cd 100644
--- a/build/SkiaSharp.props
+++ b/build/SkiaSharp.props
@@ -1,6 +1,6 @@
-
-
+
+
diff --git a/dirs.proj b/dirs.proj
index a48ad6e03d..bf32abef72 100644
--- a/dirs.proj
+++ b/dirs.proj
@@ -7,6 +7,7 @@
+
diff --git a/global.json b/global.json
index 128511eb48..b2b2da7c4f 100644
--- a/global.json
+++ b/global.json
@@ -1,6 +1,6 @@
{
"sdk": {
- "version": "3.1.101"
+ "version": "3.1.401"
},
"msbuild-sdks": {
"Microsoft.Build.Traversal": "1.0.43",
diff --git a/native/Avalonia.Native/src/OSX/rendertarget.mm b/native/Avalonia.Native/src/OSX/rendertarget.mm
index 1565417c1a..93a33bbbb0 100644
--- a/native/Avalonia.Native/src/OSX/rendertarget.mm
+++ b/native/Avalonia.Native/src/OSX/rendertarget.mm
@@ -110,7 +110,7 @@
if(_renderbuffer != 0)
glDeleteRenderbuffers(1, &_renderbuffer);
}
- IOSurfaceDecrementUseCount(surface);
+ CFRelease(surface);
}
@end
diff --git a/nukebuild/Build.cs b/nukebuild/Build.cs
index fbfbf47e1b..097815cc69 100644
--- a/nukebuild/Build.cs
+++ b/nukebuild/Build.cs
@@ -5,6 +5,7 @@ using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
+using System.Threading.Tasks;
using System.Xml.Linq;
using Nuke.Common;
using Nuke.Common.Git;
@@ -15,6 +16,7 @@ using Nuke.Common.Tools.MSBuild;
using Nuke.Common.Tools.Npm;
using Nuke.Common.Utilities;
using Nuke.Common.Utilities.Collections;
+using Pharmacist.Core;
using static Nuke.Common.EnvironmentInfo;
using static Nuke.Common.IO.FileSystemTasks;
using static Nuke.Common.IO.PathConstruction;
@@ -124,6 +126,7 @@ partial class Build : NukeBuild
Target CompileHtmlPreviewer => _ => _
.DependsOn(Clean)
+ .OnlyWhenStatic(() => !Parameters.SkipPreviewer)
.Executes(() =>
{
var webappDir = RootDirectory / "src" / "Avalonia.DesignerSupport" / "Remote" / "HtmlTransport" / "webapp";
@@ -135,11 +138,21 @@ partial class Build : NukeBuild
.SetWorkingDirectory(webappDir)
.SetCommand("dist"));
});
-
- Target Compile => _ => _
+
+ Target CompileNative => _ => _
.DependsOn(Clean)
- .DependsOn(CompileHtmlPreviewer)
+ .OnlyWhenStatic(() => EnvironmentInfo.IsOsx)
.Executes(() =>
+ {
+ var project = $"{RootDirectory}/native/Avalonia.Native/src/OSX/Avalonia.Native.OSX.xcodeproj/";
+ var args = $"-project {project} -configuration {Parameters.Configuration} CONFIGURATION_BUILD_DIR={RootDirectory}/Build/Products/Release";
+ ProcessTasks.StartProcess("xcodebuild", args).AssertZeroExitCode();
+ });
+
+ Target Compile => _ => _
+ .DependsOn(Clean, CompileNative)
+ .DependsOn(CompileHtmlPreviewer)
+ .Executes(async () =>
{
if (Parameters.IsRunningOnWindows)
MsBuildCommon(Parameters.MSBuildSolution, c => c
@@ -153,8 +166,44 @@ partial class Build : NukeBuild
.AddProperty("PackageVersion", Parameters.Version)
.SetConfiguration(Parameters.Configuration)
);
+
+ await CompileReactiveEvents();
});
+ async Task CompileReactiveEvents()
+ {
+ var avaloniaBuildOutput = Path.Combine(RootDirectory, "packages", "Avalonia", "bin", Parameters.Configuration);
+ var avaloniaAssemblies = GlobFiles(avaloniaBuildOutput, "**/Avalonia*.dll")
+ .Where(file => !file.Contains("Avalonia.Build.Tasks") &&
+ !file.Contains("Avalonia.Remote.Protocol"));
+
+ var eventsDirectory = GlobDirectories($"{RootDirectory}/src/**/Avalonia.ReactiveUI.Events").First();
+ var eventsBuildFile = Path.Combine(eventsDirectory, "Events_Avalonia.cs");
+ if (File.Exists(eventsBuildFile))
+ File.Delete(eventsBuildFile);
+
+ using (var stream = File.Create(eventsBuildFile))
+ using (var writer = new StreamWriter(stream))
+ {
+ await ObservablesForEventGenerator.ExtractEventsFromAssemblies(
+ writer, avaloniaAssemblies, new string[0], "netstandard2.0"
+ );
+ }
+
+ var eventsProject = Path.Combine(eventsDirectory, "Avalonia.ReactiveUI.Events.csproj");
+ if (Parameters.IsRunningOnWindows)
+ MsBuildCommon(eventsProject, c => c
+ .SetArgumentConfigurator(a => a.Add("/r"))
+ .AddTargets("Build")
+ );
+ else
+ DotNetBuild(c => c
+ .SetProjectFile(eventsProject)
+ .AddProperty("PackageVersion", Parameters.Version)
+ .SetConfiguration(Parameters.Configuration)
+ );
+ }
+
void RunCoreTest(string projectName)
{
Information($"Running tests from {projectName}");
diff --git a/nukebuild/BuildParameters.cs b/nukebuild/BuildParameters.cs
index 149716b416..a167e9d892 100644
--- a/nukebuild/BuildParameters.cs
+++ b/nukebuild/BuildParameters.cs
@@ -19,10 +19,14 @@ public partial class Build
[Parameter("force-nuget-version")]
public string ForceNugetVersion { get; set; }
+ [Parameter("skip-previewer")]
+ public bool SkipPreviewer { get; set; }
+
public class BuildParameters
{
public string Configuration { get; }
public bool SkipTests { get; }
+ public bool SkipPreviewer {get;}
public string MainRepo { get; }
public string MasterBranch { get; }
public string RepositoryName { get; }
@@ -63,6 +67,7 @@ public partial class Build
// ARGUMENTS
Configuration = b.Configuration ?? "Release";
SkipTests = b.SkipTests;
+ SkipPreviewer = b.SkipPreviewer;
// CONFIGURATION
MainRepo = "https://github.com/AvaloniaUI/Avalonia";
diff --git a/nukebuild/_build.csproj b/nukebuild/_build.csproj
index 4c64d4ff93..b06e49f2eb 100644
--- a/nukebuild/_build.csproj
+++ b/nukebuild/_build.csproj
@@ -17,6 +17,7 @@
+
diff --git a/samples/ControlCatalog/MainView.xaml b/samples/ControlCatalog/MainView.xaml
index efc90357ed..790813fda0 100644
--- a/samples/ControlCatalog/MainView.xaml
+++ b/samples/ControlCatalog/MainView.xaml
@@ -45,7 +45,10 @@
-
+
+
+
diff --git a/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml b/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml
index f90a0c4658..a49616e543 100644
--- a/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml
+++ b/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml
@@ -51,6 +51,11 @@
Width="200"
Margin="0,0,0,8"
FilterMode="None"/>
+
+
diff --git a/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs b/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs
index f9d6a72a3a..574cc79a7d 100644
--- a/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs
+++ b/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs
@@ -92,13 +92,28 @@ namespace ControlCatalog.Pages
}
public StateData[] States { get; private set; }
+ private LinkedList[] BuildAllSentences()
+ {
+ return new string[]
+ {
+ "Hello world",
+ "No this is Patrick",
+ "Never gonna give you up",
+ "How does one patch KDE2 under FreeBSD"
+ }
+ .Select(x => new LinkedList(x.Split(' ')))
+ .ToArray();
+ }
+ public LinkedList[] Sentences { get; private set; }
+
public AutoCompleteBoxPage()
{
this.InitializeComponent();
States = BuildAllStates();
+ Sentences = BuildAllSentences();
- foreach (AutoCompleteBox box in GetAllAutoCompleteBox())
+ foreach (AutoCompleteBox box in GetAllAutoCompleteBox().Where(x => x.Name != "CustomAutocompleteBox"))
{
box.Items = States;
}
@@ -116,6 +131,11 @@ namespace ControlCatalog.Pages
var asyncBox = this.FindControl("AsyncBox");
asyncBox.AsyncPopulator = PopulateAsync;
+
+ var customAutocompleteBox = this.FindControl("CustomAutocompleteBox");
+ customAutocompleteBox.Items = Sentences.SelectMany(x => x);
+ customAutocompleteBox.TextFilter = LastWordContains;
+ customAutocompleteBox.TextSelector = AppendWord;
}
private IEnumerable GetAllAutoCompleteBox()
{
@@ -137,6 +157,42 @@ namespace ControlCatalog.Pages
.ToList();
}
+ private bool LastWordContains(string searchText, string item)
+ {
+ var words = searchText.Split(' ');
+ var options = Sentences.Select(x => x.First).ToArray();
+ for (var i = 0; i < words.Length; ++i)
+ {
+ var word = words[i];
+ for (var j = 0; j < options.Length; ++j)
+ {
+ var option = options[j];
+ if (option == null)
+ continue;
+
+ if (i == words.Length - 1)
+ {
+ options[j] = option.Value.ToLower().Contains(word.ToLower()) ? option : null;
+ }
+ else
+ {
+ options[j] = option.Value.Equals(word, StringComparison.InvariantCultureIgnoreCase) ? option.Next : null;
+ }
+ }
+ }
+
+ return options.Any(x => x != null && x.Value == item);
+ }
+ private string AppendWord(string text, string item)
+ {
+ string[] parts = text.Split(' ');
+ if (parts.Length == 0)
+ return item;
+
+ parts[parts.Length - 1] = item;
+ return string.Join(" ", parts);
+ }
+
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
diff --git a/samples/ControlCatalog/Pages/DataGridPage.xaml.cs b/samples/ControlCatalog/Pages/DataGridPage.xaml.cs
index 0b7fb12aff..2a30f4d91b 100644
--- a/samples/ControlCatalog/Pages/DataGridPage.xaml.cs
+++ b/samples/ControlCatalog/Pages/DataGridPage.xaml.cs
@@ -1,8 +1,12 @@
+using System.Collections;
using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
using ControlCatalog.Models;
using Avalonia.Collections;
+using Avalonia.Data;
namespace ControlCatalog.Pages
{
@@ -11,12 +15,22 @@ namespace ControlCatalog.Pages
public DataGridPage()
{
this.InitializeComponent();
+
+ var dataGridSortDescription = DataGridSortDescription.FromPath(nameof(Country.Region), ListSortDirection.Ascending, new ReversedStringComparer());
+ var collectionView1 = new DataGridCollectionView(Countries.All);
+ collectionView1.SortDescriptions.Add(dataGridSortDescription);
var dg1 = this.FindControl("dataGrid1");
dg1.IsReadOnly = true;
dg1.LoadingRow += Dg1_LoadingRow;
- var collectionView1 = new DataGridCollectionView(Countries.All);
- //collectionView.GroupDescriptions.Add(new PathGroupDescription("Region"));
-
+ dg1.Sorting += (s, a) =>
+ {
+ var property = ((a.Column as DataGridBoundColumn)?.Binding as Binding).Path;
+ if (property == dataGridSortDescription.PropertyPath
+ && !collectionView1.SortDescriptions.Contains(dataGridSortDescription))
+ {
+ collectionView1.SortDescriptions.Add(dataGridSortDescription);
+ }
+ };
dg1.Items = collectionView1;
var dg2 = this.FindControl("dataGridGrouping");
@@ -53,5 +67,20 @@ namespace ControlCatalog.Pages
{
AvaloniaXamlLoader.Load(this);
}
+
+ private class ReversedStringComparer : IComparer