diff --git a/.gitignore b/.gitignore
index a9a8fd36b4..583a2b8a2b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -176,5 +176,9 @@ nuget
Avalonia.XBuild.sln
project.lock.json
.idea/*
-**/obj-Skia/*
-**/obj-Direct2D1/*
+
+
+##################
+## BenchmarkDotNet
+##################
+BenchmarkDotNet.Artifacts/
diff --git a/build/System.Memory.props b/build/System.Memory.props
new file mode 100644
index 0000000000..f3253f8882
--- /dev/null
+++ b/build/System.Memory.props
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/packages.cake b/packages.cake
index 7e7e722c82..79147b5f99 100644
--- a/packages.cake
+++ b/packages.cake
@@ -253,7 +253,7 @@ public class Packages
}
.Deps(new string[]{null, "netcoreapp2.0"},
"System.ValueTuple", "System.ComponentModel.TypeConverter", "System.ComponentModel.Primitives",
- "System.Runtime.Serialization.Primitives", "System.Xml.XmlDocument", "System.Xml.ReaderWriter")
+ "System.Runtime.Serialization.Primitives", "System.Xml.XmlDocument", "System.Xml.ReaderWriter", "System.Memory")
.ToArray(),
Files = coreLibrariesNuSpecContent
.Concat(win32CoreLibrariesNuSpecContent).Concat(net45RuntimePlatform)
diff --git a/src/Avalonia.Base/AvaloniaObject.cs b/src/Avalonia.Base/AvaloniaObject.cs
index 48e72db126..baca1494be 100644
--- a/src/Avalonia.Base/AvaloniaObject.cs
+++ b/src/Avalonia.Base/AvaloniaObject.cs
@@ -10,6 +10,7 @@ using System.Reactive.Linq;
using Avalonia.Data;
using Avalonia.Diagnostics;
using Avalonia.Logging;
+using Avalonia.Reactive;
using Avalonia.Threading;
using Avalonia.Utilities;
@@ -38,7 +39,7 @@ namespace Avalonia
/// Maintains a list of direct property binding subscriptions so that the binding source
/// doesn't get collected.
///
- private List _directBindings;
+ private List _directBindings;
///
/// Event handler for implementation.
@@ -359,25 +360,12 @@ namespace Avalonia
property,
description);
- IDisposable subscription = null;
-
if (_directBindings == null)
{
- _directBindings = new List();
+ _directBindings = new List();
}
- subscription = source
- .Select(x => CastOrDefault(x, property.PropertyType))
- .Do(_ => { }, () => _directBindings.Remove(subscription))
- .Subscribe(x => SetDirectValue(property, x));
-
- _directBindings.Add(subscription);
-
- return Disposable.Create(() =>
- {
- subscription.Dispose();
- _directBindings.Remove(subscription);
- });
+ return new DirectBindingSubscription(this, property, source);
}
else
{
@@ -908,5 +896,38 @@ namespace Avalonia
value,
priority);
}
+
+ private class DirectBindingSubscription : IObserver