diff --git a/.gitmodules b/.gitmodules
index 98b6d076c1..2d2a9ac497 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,7 +1,3 @@
-[submodule "src/Avalonia.HtmlRenderer/external"]
- path = src/Avalonia.HtmlRenderer/external
- url = https://github.com/AvaloniaUI/HTML-Renderer.git
- branch = perspex-pcl
[submodule "src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github"]
path = src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github
url = https://github.com/AvaloniaUI/Portable.Xaml.git
diff --git a/Avalonia.sln b/Avalonia.sln
index 47ee4c1ad9..7b4a359f06 100644
--- a/Avalonia.sln
+++ b/Avalonia.sln
@@ -1,4 +1,4 @@
-
+
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27130.2027
@@ -68,8 +68,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Gtk", "Gtk", "{B9894058-278
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.ReactiveUI", "src\Avalonia.ReactiveUI\Avalonia.ReactiveUI.csproj", "{6417B24E-49C2-4985-8DB2-3AB9D898EC91}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.HtmlRenderer", "src\Avalonia.HtmlRenderer\Avalonia.HtmlRenderer.csproj", "{5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}"
-EndProject
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "PlatformSupport", "src\Shared\PlatformSupport\PlatformSupport.shproj", "{E4D9629C-F168-4224-3F51-A5E482FFBC42}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Markup", "src\Markup\Avalonia.Markup\Avalonia.Markup.csproj", "{6417E941-21BC-467B-A771-0DE389353CE6}"
@@ -134,10 +132,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Gtk3", "src\Gtk\Av
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ControlCatalog.NetCore", "samples\ControlCatalog.NetCore\ControlCatalog.NetCore.csproj", "{39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{74487168-7D91-487E-BF93-055F2251461E}"
-EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Props", "Props", "{F3AC8BC1-27F5-4255-9AFC-04ABFD11683A}"
ProjectSection(SolutionItems) = preProject
+ build\Base.props = build\Base.props
+ build\Binding.props = build\Binding.props
build\JetBrains.Annotations.props = build\JetBrains.Annotations.props
build\JetBrains.dotMemoryUnit.props = build\JetBrains.dotMemoryUnit.props
build\Magick.NET-Q16-AnyCPU.props = build\Magick.NET-Q16-AnyCPU.props
@@ -1162,44 +1160,6 @@ Global
{6417B24E-49C2-4985-8DB2-3AB9D898EC91}.Release|NetCoreOnly.Build.0 = Release|Any CPU
{6417B24E-49C2-4985-8DB2-3AB9D898EC91}.Release|x86.ActiveCfg = Release|Any CPU
{6417B24E-49C2-4985-8DB2-3AB9D898EC91}.Release|x86.Build.0 = Release|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Ad-Hoc|NetCoreOnly.ActiveCfg = Debug|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Ad-Hoc|x86.Build.0 = Debug|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.AppStore|iPhone.ActiveCfg = Release|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.AppStore|iPhone.Build.0 = Release|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.AppStore|NetCoreOnly.ActiveCfg = Debug|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.AppStore|x86.ActiveCfg = Debug|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.AppStore|x86.Build.0 = Debug|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Debug|iPhone.Build.0 = Debug|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Debug|NetCoreOnly.ActiveCfg = Debug|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Debug|NetCoreOnly.Build.0 = Debug|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Debug|x86.ActiveCfg = Debug|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Debug|x86.Build.0 = Debug|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Release|Any CPU.Build.0 = Release|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Release|iPhone.ActiveCfg = Release|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Release|iPhone.Build.0 = Release|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Release|NetCoreOnly.ActiveCfg = Release|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Release|NetCoreOnly.Build.0 = Release|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Release|x86.ActiveCfg = Release|Any CPU
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}.Release|x86.Build.0 = Release|Any CPU
{6417E941-21BC-467B-A771-0DE389353CE6}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
{6417E941-21BC-467B-A771-0DE389353CE6}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
{6417E941-21BC-467B-A771-0DE389353CE6}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
@@ -2582,8 +2542,6 @@ Global
{7D2D3083-71DD-4CC9-8907-39A0D86FB322} = {3743B0F2-CC41-4F14-A8C8-267F579BF91E}
{BB1F7BB5-6AD4-4776-94D9-C09D0A972658} = {B9894058-278A-46B5-B6ED-AD613FCC03B3}
{39D7B147-1A5B-47C2-9D01-21FB7C47C4B3} = {9B9E3891-2366-4253-A952-D08BCEB71098}
- {F3AC8BC1-27F5-4255-9AFC-04ABFD11683A} = {74487168-7D91-487E-BF93-055F2251461E}
- {4D6FAF79-58B4-482F-9122-0668C346364C} = {74487168-7D91-487E-BF93-055F2251461E}
{854568D5-13D1-4B4F-B50D-534DC7EFD3C9} = {86C53C40-57AA-45B8-AD42-FAE0EFDF0F2B}
{638580B0-7910-40EF-B674-DCB34DA308CD} = {A0CC0258-D18C-4AB3-854F-7101680FC3F9}
{CBC4FF2F-92D4-420B-BE21-9FE0B930B04E} = {B39A8919-9F95-48FE-AD7B-76E08B509888}
diff --git a/build.cake b/build.cake
index 20d77e25d3..aa35d88aac 100644
--- a/build.cake
+++ b/build.cake
@@ -376,7 +376,7 @@ Task("Inspect")
{
var badIssues = new []{"PossibleNullReferenceException"};
var whitelist = new []{"tests", "src\\android", "src\\ios",
- "src\\windows\\avalonia.designer", "src\\avalonia.htmlrenderer\\external",
+ "src\\windows\\avalonia.designer",
"src\\markup\\avalonia.markup.xaml\\portablexaml\\portable.xaml.github"};
Information("Running code inspections");
diff --git a/build/Binding.props b/build/Binding.props
new file mode 100644
index 0000000000..a512ee1d9c
--- /dev/null
+++ b/build/Binding.props
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/packages.cake b/packages.cake
index e996544b68..2ad09b5eae 100644
--- a/packages.cake
+++ b/packages.cake
@@ -262,23 +262,6 @@ public class Packages
OutputDirectory = parameters.NugetRoot
},
///////////////////////////////////////////////////////////////////////////////
- // Avalonia.HtmlRenderer
- ///////////////////////////////////////////////////////////////////////////////
- new NuGetPackSettings()
- {
- Id = "Avalonia.HtmlRenderer",
- Dependencies = new []
- {
- new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version }
- },
- Files = new []
- {
- new NuSpecContent { Source = "Avalonia.HtmlRenderer.dll", Target = "lib/netstandard2.0" }
- },
- BasePath = context.Directory("./src/Avalonia.HtmlRenderer/bin/" + parameters.DirSuffix + "/netstandard2.0"),
- OutputDirectory = parameters.NugetRoot
- },
- ///////////////////////////////////////////////////////////////////////////////
// Avalonia.ReactiveUI
///////////////////////////////////////////////////////////////////////////////
new NuGetPackSettings()
diff --git a/samples/ControlCatalog.Android/ControlCatalog.Android.csproj b/samples/ControlCatalog.Android/ControlCatalog.Android.csproj
index 2a91d6a3da..fab8ecd768 100644
--- a/samples/ControlCatalog.Android/ControlCatalog.Android.csproj
+++ b/samples/ControlCatalog.Android/ControlCatalog.Android.csproj
@@ -111,10 +111,6 @@
{7062ae20-5dcc-4442-9645-8195bdece63e}
Avalonia.Diagnostics
-
- {5fb2b005-0a7f-4dad-add4-3ed01444e63d}
- Avalonia.HtmlRenderer
-
{62024b2d-53eb-4638-b26b-85eeaa54866e}
Avalonia.Input
diff --git a/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj b/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj
index c1c5cdcaf7..a60fd242e4 100644
--- a/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj
+++ b/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj
@@ -141,10 +141,6 @@
{7062AE20-5DCC-4442-9645-8195BDECE63E}
Avalonia.Diagnostics
-
- {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D}
- Avalonia.HtmlRenderer
-
{62024B2D-53EB-4638-B26B-85EEAA54866E}
Avalonia.Input
diff --git a/samples/ControlCatalog/ControlCatalog.csproj b/samples/ControlCatalog/ControlCatalog.csproj
index c37002ef6a..dea9b35e24 100644
--- a/samples/ControlCatalog/ControlCatalog.csproj
+++ b/samples/ControlCatalog/ControlCatalog.csproj
@@ -25,7 +25,6 @@
-
diff --git a/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs b/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs
index 6f3b8361cd..f9d6a72a3a 100644
--- a/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs
+++ b/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs
@@ -2,12 +2,14 @@ using Avalonia.Controls;
using Avalonia.LogicalTree;
using Avalonia.Markup;
using Avalonia.Markup.Xaml;
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Markup.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
+using Avalonia.Data.Converters;
+using Avalonia.Data;
namespace ControlCatalog.Pages
{
diff --git a/samples/Previewer/Previewer.csproj b/samples/Previewer/Previewer.csproj
index 13e2418d67..b4dda473f2 100644
--- a/samples/Previewer/Previewer.csproj
+++ b/samples/Previewer/Previewer.csproj
@@ -15,7 +15,6 @@
-
diff --git a/samples/RenderTest/Pages/AnimationsPage.xaml b/samples/RenderTest/Pages/AnimationsPage.xaml
index 415c08728f..5287e4e373 100644
--- a/samples/RenderTest/Pages/AnimationsPage.xaml
+++ b/samples/RenderTest/Pages/AnimationsPage.xaml
@@ -48,13 +48,13 @@
PlaybackDirection="AlternateReverse"
Easing="SineEaseInOut">
-
+
-
+
-
+
@@ -63,8 +63,8 @@
-
-
+
+
@@ -76,8 +76,8 @@
Easing="QuadraticEaseInOut"
RepeatCount="Loop">
-
-
+
+
@@ -86,7 +86,7 @@
-
+
@@ -95,10 +95,10 @@
-
+
-
+
diff --git a/samples/RenderTest/Pages/ClippingPage.xaml b/samples/RenderTest/Pages/ClippingPage.xaml
index 434468888a..2e7944b0fc 100644
--- a/samples/RenderTest/Pages/ClippingPage.xaml
+++ b/samples/RenderTest/Pages/ClippingPage.xaml
@@ -10,7 +10,7 @@
-
+
diff --git a/src/Android/Avalonia.Android/Resources/Resource.Designer.cs b/src/Android/Avalonia.Android/Resources/Resource.Designer.cs
index 80cbbc51ec..e66c2800d3 100644
--- a/src/Android/Avalonia.Android/Resources/Resource.Designer.cs
+++ b/src/Android/Avalonia.Android/Resources/Resource.Designer.cs
@@ -40,11 +40,14 @@ namespace Avalonia.Android
public partial class String
{
+ // aapt resource value: 0x7f020002
+ public static int ApplicationName = 2130837506;
+
// aapt resource value: 0x7f020001
- public static int ApplicationName = 2130837505;
+ public static int Hello = 2130837505;
// aapt resource value: 0x7f020000
- public static int Hello = 2130837504;
+ public static int library_name = 2130837504;
static String()
{
diff --git a/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj b/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj
index 9977d77978..359adaa1f0 100644
--- a/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj
+++ b/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj
@@ -143,10 +143,6 @@
{3e10a5fa-e8da-48b1-ad44-6a5b6cb7750f}
Avalonia.Themes.Default
-
- {5fb2b005-0a7f-4dad-add4-3ed01444e63d}
- Avalonia.HtmlRenderer
-
{7d2d3083-71dd-4cc9-8907-39a0d86fb322}
Avalonia.Skia
diff --git a/src/Avalonia.Animation/Animation.cs b/src/Avalonia.Animation/Animation.cs
index 525be53fc2..aa436f5f4e 100644
--- a/src/Avalonia.Animation/Animation.cs
+++ b/src/Avalonia.Animation/Animation.cs
@@ -18,6 +18,28 @@ namespace Avalonia.Animation
///
public class Animation : AvaloniaList, IDisposable, IAnimation
{
+ private readonly static List<(Func Condition, Type Animator)> Animators = new List<(Func, Type)>
+ {
+ ( prop => typeof(double).IsAssignableFrom(prop.PropertyType), typeof(DoubleAnimator) )
+ };
+
+ public static void RegisterAnimator(Func condition)
+ where TAnimator: IAnimator
+ {
+ Animators.Insert(0, (condition, typeof(TAnimator)));
+ }
+
+ private static Type GetAnimatorType(AvaloniaProperty property)
+ {
+ foreach (var (condition, type) in Animators)
+ {
+ if (condition(property))
+ {
+ return type;
+ }
+ }
+ return null;
+ }
private bool _isChildrenChanged = false;
private List _subscription = new List();
@@ -67,14 +89,13 @@ namespace Avalonia.Animation
{
foreach (var setter in keyframe)
{
- var custAttr = setter.GetType()
- .GetCustomAttributes()
- .Where(p => p.GetType() == typeof(AnimatorAttribute));
+ var handler = GetAnimatorType(setter.Property);
- if (!custAttr.Any())
- throw new InvalidProgramException($"Type {setter.GetType()} doesn't have Animator attribute.");
+ if (handler == null)
+ {
+ throw new InvalidOperationException($"No animator registered for the property {setter.Property}. Add an animator to the Animation.Animators collection that matches this property to animate it.");
+ }
- var handler = ((AnimatorAttribute)custAttr.First()).HandlerType;
if (!handlerList.Contains((handler, setter.Property)))
handlerList.Add((handler, setter.Property));
diff --git a/src/Avalonia.Animation/AnimationSetter.cs b/src/Avalonia.Animation/AnimationSetter.cs
deleted file mode 100644
index 1194e4606b..0000000000
--- a/src/Avalonia.Animation/AnimationSetter.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Linq;
-using System.Reactive.Linq;
-using System.Diagnostics;
-using Avalonia.Animation.Utils;
-using Avalonia.Data;
-
-namespace Avalonia.Animation
-{
- public abstract class AnimationSetter : IAnimationSetter
- {
- public AvaloniaProperty Property { get; set; }
- public object Value { get; set; }
- }
-}
diff --git a/src/Avalonia.Animation/AnimatorAttribute.cs b/src/Avalonia.Animation/AnimatorAttribute.cs
deleted file mode 100644
index 58ee823a87..0000000000
--- a/src/Avalonia.Animation/AnimatorAttribute.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System;
-
-namespace Avalonia.Animation
-{
- ///
- /// Attribute for objects
- /// that maps the setter to it's .
- ///
- public class AnimatorAttribute : Attribute
- {
- public Type HandlerType;
-
- public AnimatorAttribute(Type handler)
- {
- this.HandlerType = handler;
- }
- }
-}
\ No newline at end of file
diff --git a/src/Avalonia.Animation/DoubleSetter.cs b/src/Avalonia.Animation/DoubleSetter.cs
deleted file mode 100644
index e524324a8c..0000000000
--- a/src/Avalonia.Animation/DoubleSetter.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Linq;
-using System.Reactive.Linq;
-using System.Diagnostics;
-using Avalonia.Animation.Utils;
-using Avalonia.Data;
-
-namespace Avalonia.Animation
-{
- ///
- /// Setter that handles properties
- /// in the target.
- ///
- [Animator(typeof(DoubleAnimator))]
- public class DoubleSetter : AnimationSetter
- {
-
- }
-}
\ No newline at end of file
diff --git a/src/Avalonia.Base/Avalonia.Base.csproj b/src/Avalonia.Base/Avalonia.Base.csproj
index 35adcbeb92..26397a6f32 100644
--- a/src/Avalonia.Base/Avalonia.Base.csproj
+++ b/src/Avalonia.Base/Avalonia.Base.csproj
@@ -5,6 +5,7 @@
Avalonia
+
\ No newline at end of file
diff --git a/src/Avalonia.Base/AvaloniaObject.cs b/src/Avalonia.Base/AvaloniaObject.cs
index 1a2db9fc3d..48e72db126 100644
--- a/src/Avalonia.Base/AvaloniaObject.cs
+++ b/src/Avalonia.Base/AvaloniaObject.cs
@@ -703,7 +703,7 @@ namespace Avalonia
/// The default value.
private object GetDefaultValue(AvaloniaProperty property)
{
- if (property.Inherits && _inheritanceParent is AvaloniaObject aobj)
+ if (property.Inherits && InheritanceParent is AvaloniaObject aobj)
return aobj.GetValueInternal(property);
return ((IStyledPropertyAccessor) property).GetDefaultValue(GetType());
}
diff --git a/src/Avalonia.Base/Collections/AvaloniaDictionary.cs b/src/Avalonia.Base/Collections/AvaloniaDictionary.cs
index 84ac85d3db..e8dc2a5ed7 100644
--- a/src/Avalonia.Base/Collections/AvaloniaDictionary.cs
+++ b/src/Avalonia.Base/Collections/AvaloniaDictionary.cs
@@ -7,6 +7,7 @@ using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Linq;
+using Avalonia.Data.Core;
namespace Avalonia.Collections
{
@@ -116,8 +117,8 @@ namespace Avalonia.Collections
_inner = new Dictionary();
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Count"));
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Item[]"));
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Count)));
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(CommonPropertyNames.IndexerName));
if (CollectionChanged != null)
diff --git a/src/Avalonia.Base/Data/BindingNotification.cs b/src/Avalonia.Base/Data/BindingNotification.cs
index 5510a73b91..5d3e6b26f4 100644
--- a/src/Avalonia.Base/Data/BindingNotification.cs
+++ b/src/Avalonia.Base/Data/BindingNotification.cs
@@ -171,8 +171,7 @@ namespace Avalonia.Data
///
public static object ExtractError(object o)
{
- var notification = o as BindingNotification;
- return notification != null ? notification.Error : o;
+ return o is BindingNotification notification ? notification.Error : o;
}
///
diff --git a/src/Markup/Avalonia.Markup/AlwaysEnabledDelegateCommand.cs b/src/Avalonia.Base/Data/Converters/AlwaysEnabledDelegateCommand.cs
similarity index 97%
rename from src/Markup/Avalonia.Markup/AlwaysEnabledDelegateCommand.cs
rename to src/Avalonia.Base/Data/Converters/AlwaysEnabledDelegateCommand.cs
index 48db99b43c..d2fb48ffb8 100644
--- a/src/Markup/Avalonia.Markup/AlwaysEnabledDelegateCommand.cs
+++ b/src/Avalonia.Base/Data/Converters/AlwaysEnabledDelegateCommand.cs
@@ -6,7 +6,7 @@ using System.Reflection;
using System.Text;
using System.Windows.Input;
-namespace Avalonia.Markup
+namespace Avalonia.Data.Converters
{
class AlwaysEnabledDelegateCommand : ICommand
{
diff --git a/src/Markup/Avalonia.Markup/BoolConverters.cs b/src/Avalonia.Base/Data/Converters/BoolConverters.cs
similarity index 94%
rename from src/Markup/Avalonia.Markup/BoolConverters.cs
rename to src/Avalonia.Base/Data/Converters/BoolConverters.cs
index e049dccc06..6b429e1087 100644
--- a/src/Markup/Avalonia.Markup/BoolConverters.cs
+++ b/src/Avalonia.Base/Data/Converters/BoolConverters.cs
@@ -3,7 +3,7 @@
using System.Linq;
-namespace Avalonia.Markup
+namespace Avalonia.Data.Converters
{
///
/// Provides a set of useful s for working with string values.
diff --git a/src/Markup/Avalonia.Markup/DefaultValueConverter.cs b/src/Avalonia.Base/Data/Converters/DefaultValueConverter.cs
similarity index 98%
rename from src/Markup/Avalonia.Markup/DefaultValueConverter.cs
rename to src/Avalonia.Base/Data/Converters/DefaultValueConverter.cs
index 28d64eb561..ec75076892 100644
--- a/src/Markup/Avalonia.Markup/DefaultValueConverter.cs
+++ b/src/Avalonia.Base/Data/Converters/DefaultValueConverter.cs
@@ -7,7 +7,7 @@ using Avalonia.Data;
using Avalonia.Utilities;
using System.Windows.Input;
-namespace Avalonia.Markup
+namespace Avalonia.Data.Converters
{
///
/// Provides a default set of value conversions for bindings that do not specify a value
diff --git a/src/Markup/Avalonia.Markup/FuncMultiValueConverter.cs b/src/Avalonia.Base/Data/Converters/FuncMultiValueConverter.cs
similarity index 97%
rename from src/Markup/Avalonia.Markup/FuncMultiValueConverter.cs
rename to src/Avalonia.Base/Data/Converters/FuncMultiValueConverter.cs
index 75aace0bd9..6e1c4cb0e3 100644
--- a/src/Markup/Avalonia.Markup/FuncMultiValueConverter.cs
+++ b/src/Avalonia.Base/Data/Converters/FuncMultiValueConverter.cs
@@ -6,7 +6,7 @@ using System.Collections.Generic;
using System.Globalization;
using System.Linq;
-namespace Avalonia.Markup
+namespace Avalonia.Data.Converters
{
///
/// A general purpose that uses a
diff --git a/src/Markup/Avalonia.Markup/FuncValueConverter.cs b/src/Avalonia.Base/Data/Converters/FuncValueConverter.cs
similarity index 97%
rename from src/Markup/Avalonia.Markup/FuncValueConverter.cs
rename to src/Avalonia.Base/Data/Converters/FuncValueConverter.cs
index 109de9371d..b747587b4a 100644
--- a/src/Markup/Avalonia.Markup/FuncValueConverter.cs
+++ b/src/Avalonia.Base/Data/Converters/FuncValueConverter.cs
@@ -5,7 +5,7 @@ using System;
using System.Globalization;
using Avalonia.Utilities;
-namespace Avalonia.Markup
+namespace Avalonia.Data.Converters
{
///
/// A general purpose that uses a
diff --git a/src/Markup/Avalonia.Markup/IMultiValueConverter.cs b/src/Avalonia.Base/Data/Converters/IMultiValueConverter.cs
similarity index 97%
rename from src/Markup/Avalonia.Markup/IMultiValueConverter.cs
rename to src/Avalonia.Base/Data/Converters/IMultiValueConverter.cs
index be75dabb1c..3f84fcb3e7 100644
--- a/src/Markup/Avalonia.Markup/IMultiValueConverter.cs
+++ b/src/Avalonia.Base/Data/Converters/IMultiValueConverter.cs
@@ -5,7 +5,7 @@ using System;
using System.Collections.Generic;
using System.Globalization;
-namespace Avalonia.Markup
+namespace Avalonia.Data.Converters
{
///
/// Converts multi-binding inputs to a final value.
diff --git a/src/Markup/Avalonia.Markup/IValueConverter.cs b/src/Avalonia.Base/Data/Converters/IValueConverter.cs
similarity index 98%
rename from src/Markup/Avalonia.Markup/IValueConverter.cs
rename to src/Avalonia.Base/Data/Converters/IValueConverter.cs
index 10d5c626c2..b55a2c4fe8 100644
--- a/src/Markup/Avalonia.Markup/IValueConverter.cs
+++ b/src/Avalonia.Base/Data/Converters/IValueConverter.cs
@@ -5,7 +5,7 @@ using System;
using System.Globalization;
using Avalonia.Data;
-namespace Avalonia.Markup
+namespace Avalonia.Data.Converters
{
///
/// Converts a binding value.
diff --git a/src/Markup/Avalonia.Markup/StringConverters.cs b/src/Avalonia.Base/Data/Converters/StringConverters.cs
similarity index 96%
rename from src/Markup/Avalonia.Markup/StringConverters.cs
rename to src/Avalonia.Base/Data/Converters/StringConverters.cs
index fda79c76a3..470f0d2289 100644
--- a/src/Markup/Avalonia.Markup/StringConverters.cs
+++ b/src/Avalonia.Base/Data/Converters/StringConverters.cs
@@ -5,7 +5,7 @@ using System;
using System.Globalization;
using Avalonia.Utilities;
-namespace Avalonia.Markup
+namespace Avalonia.Data.Converters
{
///
/// Provides a set of useful s for working with string values.
diff --git a/src/Markup/Avalonia.Markup/Data/BindingExpression.cs b/src/Avalonia.Base/Data/Core/BindingExpression.cs
similarity index 99%
rename from src/Markup/Avalonia.Markup/Data/BindingExpression.cs
rename to src/Avalonia.Base/Data/Core/BindingExpression.cs
index 5b9959e42e..4b41d1568c 100644
--- a/src/Markup/Avalonia.Markup/Data/BindingExpression.cs
+++ b/src/Avalonia.Base/Data/Core/BindingExpression.cs
@@ -5,11 +5,11 @@ using System;
using System.Globalization;
using System.Reactive.Linq;
using System.Reactive.Subjects;
-using Avalonia.Data;
+using Avalonia.Data.Converters;
using Avalonia.Logging;
using Avalonia.Utilities;
-namespace Avalonia.Markup.Data
+namespace Avalonia.Data.Core
{
///
/// Binds to an expression on an object using a type value converter to convert the values
diff --git a/src/Markup/Avalonia.Markup/Data/CommonPropertyNames.cs b/src/Avalonia.Base/Data/Core/CommonPropertyNames.cs
similarity index 89%
rename from src/Markup/Avalonia.Markup/Data/CommonPropertyNames.cs
rename to src/Avalonia.Base/Data/Core/CommonPropertyNames.cs
index f91940baf7..6760c3f259 100644
--- a/src/Markup/Avalonia.Markup/Data/CommonPropertyNames.cs
+++ b/src/Avalonia.Base/Data/Core/CommonPropertyNames.cs
@@ -1,7 +1,7 @@
// Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
-namespace Avalonia.Markup.Data
+namespace Avalonia.Data.Core
{
public static class CommonPropertyNames
{
diff --git a/src/Markup/Avalonia.Markup/Data/EmptyExpressionNode.cs b/src/Avalonia.Base/Data/Core/EmptyExpressionNode.cs
similarity index 94%
rename from src/Markup/Avalonia.Markup/Data/EmptyExpressionNode.cs
rename to src/Avalonia.Base/Data/Core/EmptyExpressionNode.cs
index 02ecd817da..93e0d5947a 100644
--- a/src/Markup/Avalonia.Markup/Data/EmptyExpressionNode.cs
+++ b/src/Avalonia.Base/Data/Core/EmptyExpressionNode.cs
@@ -4,7 +4,7 @@
using System;
using System.Reactive.Linq;
-namespace Avalonia.Markup.Data
+namespace Avalonia.Data.Core
{
internal class EmptyExpressionNode : ExpressionNode
{
diff --git a/src/Markup/Avalonia.Markup/Data/ExpressionNode.cs b/src/Avalonia.Base/Data/Core/ExpressionNode.cs
similarity index 99%
rename from src/Markup/Avalonia.Markup/Data/ExpressionNode.cs
rename to src/Avalonia.Base/Data/Core/ExpressionNode.cs
index 56c0072eaa..ae70cacdba 100644
--- a/src/Markup/Avalonia.Markup/Data/ExpressionNode.cs
+++ b/src/Avalonia.Base/Data/Core/ExpressionNode.cs
@@ -7,7 +7,7 @@ using System.Reactive.Linq;
using System.Reactive.Subjects;
using Avalonia.Data;
-namespace Avalonia.Markup.Data
+namespace Avalonia.Data.Core
{
internal abstract class ExpressionNode : ISubject
-
- {5fb2b005-0a7f-4dad-add4-3ed01444e63d}
- Avalonia.HtmlRenderer
-
{62024b2d-53eb-4638-b26b-85eeaa54866e}
Avalonia.Input
diff --git a/src/tools/Avalonia.Designer.HostApp/Avalonia.Designer.HostApp.csproj b/src/tools/Avalonia.Designer.HostApp/Avalonia.Designer.HostApp.csproj
index 5bb4b9dd4a..6ef1e1315e 100644
--- a/src/tools/Avalonia.Designer.HostApp/Avalonia.Designer.HostApp.csproj
+++ b/src/tools/Avalonia.Designer.HostApp/Avalonia.Designer.HostApp.csproj
@@ -12,7 +12,6 @@
-
diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs
index 80cd52d529..02fb1f11ad 100644
--- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs
+++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs
@@ -10,7 +10,7 @@ using System.Threading;
using System.Threading.Tasks;
using Avalonia.Data;
using Avalonia.Logging;
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Markup.Data;
using Avalonia.Platform;
using Avalonia.Threading;
using Avalonia.UnitTests;
diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Direct.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Direct.cs
index 5cc5bae8b0..980cbfaaf8 100644
--- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Direct.cs
+++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Direct.cs
@@ -12,7 +12,7 @@ using Avalonia.Data;
using Avalonia.Logging;
using Avalonia.Platform;
using Avalonia.Threading;
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Markup.Data;
using Avalonia.UnitTests;
using Moq;
using Xunit;
diff --git a/tests/Avalonia.Base.UnitTests/Collections/AvaloniaDictionaryTests.cs b/tests/Avalonia.Base.UnitTests/Collections/AvaloniaDictionaryTests.cs
index 0f08c856fe..b6ab7dac34 100644
--- a/tests/Avalonia.Base.UnitTests/Collections/AvaloniaDictionaryTests.cs
+++ b/tests/Avalonia.Base.UnitTests/Collections/AvaloniaDictionaryTests.cs
@@ -4,6 +4,7 @@
using System.Collections.Generic;
using System.Collections.Specialized;
using Avalonia.Collections;
+using Avalonia.Data.Core;
using Xunit;
namespace Avalonia.Base.UnitTests.Collections
@@ -145,7 +146,7 @@ namespace Avalonia.Base.UnitTests.Collections
var tracker = new PropertyChangedTracker(target);
target.Clear();
- Assert.Equal(new[] { "Count", "Item[]" }, tracker.Names);
+ Assert.Equal(new[] { "Count", CommonPropertyNames.IndexerName }, tracker.Names);
}
}
}
diff --git a/tests/Avalonia.Markup.UnitTests/Data/BindingExpressionTests.cs b/tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.cs
similarity index 99%
rename from tests/Avalonia.Markup.UnitTests/Data/BindingExpressionTests.cs
rename to tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.cs
index 2e0f048e21..6b71d28e22 100644
--- a/tests/Avalonia.Markup.UnitTests/Data/BindingExpressionTests.cs
+++ b/tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.cs
@@ -8,12 +8,13 @@ using System.Reactive.Linq;
using System.Threading;
using System.Threading.Tasks;
using Avalonia.Data;
-using Avalonia.Markup.Data;
+using Avalonia.Data.Converters;
+using Avalonia.Data.Core;
using Avalonia.UnitTests;
using Moq;
using Xunit;
-namespace Avalonia.Markup.UnitTests.Data
+namespace Avalonia.Base.UnitTests.Data.Core
{
public class BindingExpressionTests : IClassFixture
{
diff --git a/tests/Avalonia.Markup.UnitTests/Data/ExpressionNodeBuilderTests.cs b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionNodeBuilderTests.cs
similarity index 98%
rename from tests/Avalonia.Markup.UnitTests/Data/ExpressionNodeBuilderTests.cs
rename to tests/Avalonia.Base.UnitTests/Data/Core/ExpressionNodeBuilderTests.cs
index 4e583191a5..146b7cace1 100644
--- a/tests/Avalonia.Markup.UnitTests/Data/ExpressionNodeBuilderTests.cs
+++ b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionNodeBuilderTests.cs
@@ -3,10 +3,10 @@
using System.Collections.Generic;
using System.Linq;
-using Avalonia.Markup.Data;
+using Avalonia.Data.Core;
using Xunit;
-namespace Avalonia.Markup.UnitTests.Data
+namespace Avalonia.Base.UnitTests.Data.Core
{
public class ExpressionNodeBuilderTests
{
diff --git a/tests/Avalonia.Markup.UnitTests/Data/ExpressionNodeBuilderTests_Errors.cs b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionNodeBuilderTests_Errors.cs
similarity index 96%
rename from tests/Avalonia.Markup.UnitTests/Data/ExpressionNodeBuilderTests_Errors.cs
rename to tests/Avalonia.Base.UnitTests/Data/Core/ExpressionNodeBuilderTests_Errors.cs
index ed52d3e2a9..1bf1ce132a 100644
--- a/tests/Avalonia.Markup.UnitTests/Data/ExpressionNodeBuilderTests_Errors.cs
+++ b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionNodeBuilderTests_Errors.cs
@@ -1,10 +1,10 @@
// Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
-using Avalonia.Markup.Data;
+using Avalonia.Data.Core;
using Xunit;
-namespace Avalonia.Markup.UnitTests.Data
+namespace Avalonia.Base.UnitTests.Data.Core
{
public class ExpressionNodeBuilderTests_Errors
{
diff --git a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_AttachedProperty.cs b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_AttachedProperty.cs
similarity index 96%
rename from tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_AttachedProperty.cs
rename to tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_AttachedProperty.cs
index 5ddff63a0c..3ed2c0b7eb 100644
--- a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_AttachedProperty.cs
+++ b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_AttachedProperty.cs
@@ -6,10 +6,10 @@ using System.Collections.Generic;
using System.Reactive.Linq;
using System.Threading.Tasks;
using Avalonia.Diagnostics;
-using Avalonia.Markup.Data;
+using Avalonia.Data.Core;
using Xunit;
-namespace Avalonia.Markup.UnitTests.Data
+namespace Avalonia.Base.UnitTests.Data.Core
{
public class ExpressionObserverTests_AttachedProperty
{
@@ -127,7 +127,7 @@ namespace Avalonia.Markup.UnitTests.Data
private static class Owner
{
public static readonly AttachedProperty FooProperty =
- AvaloniaProperty.RegisterAttached(
+ AvaloniaProperty.RegisterAttached(
"Foo",
typeof(Owner),
defaultValue: "foo");
diff --git a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_AvaloniaProperty.cs b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_AvaloniaProperty.cs
similarity index 97%
rename from tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_AvaloniaProperty.cs
rename to tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_AvaloniaProperty.cs
index 6d1e9d94a9..bf2b6cbcb2 100644
--- a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_AvaloniaProperty.cs
+++ b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_AvaloniaProperty.cs
@@ -6,10 +6,10 @@ using System.Collections.Generic;
using System.Reactive.Linq;
using System.Threading.Tasks;
using Avalonia.Diagnostics;
-using Avalonia.Markup.Data;
+using Avalonia.Data.Core;
using Xunit;
-namespace Avalonia.Markup.UnitTests.Data
+namespace Avalonia.Base.UnitTests.Data.Core
{
public class ExpressionObserverTests_AvaloniaProperty
{
diff --git a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_DataValidation.cs b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_DataValidation.cs
similarity index 99%
rename from tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_DataValidation.cs
rename to tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_DataValidation.cs
index 9bf1e4711b..3732569753 100644
--- a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_DataValidation.cs
+++ b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_DataValidation.cs
@@ -7,11 +7,11 @@ using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using Avalonia.Data;
-using Avalonia.Markup.Data;
+using Avalonia.Data.Core;
using Avalonia.UnitTests;
using Xunit;
-namespace Avalonia.Markup.UnitTests.Data
+namespace Avalonia.Base.UnitTests.Data.Core
{
public class ExpressionObserverTests_DataValidation : IClassFixture
{
diff --git a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Indexer.cs b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Indexer.cs
similarity index 99%
rename from tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Indexer.cs
rename to tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Indexer.cs
index 1bdbf0d895..8a54f968b1 100644
--- a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Indexer.cs
+++ b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Indexer.cs
@@ -8,11 +8,11 @@ using System.Reactive.Linq;
using System.Threading.Tasks;
using Avalonia.Collections;
using Avalonia.Diagnostics;
-using Avalonia.Markup.Data;
+using Avalonia.Data.Core;
using Avalonia.UnitTests;
using Xunit;
-namespace Avalonia.Markup.UnitTests.Data
+namespace Avalonia.Base.UnitTests.Data.Core
{
public class ExpressionObserverTests_Indexer
{
diff --git a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Lifetime.cs b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Lifetime.cs
similarity index 98%
rename from tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Lifetime.cs
rename to tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Lifetime.cs
index 04a8e30d16..b88bf2c427 100644
--- a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Lifetime.cs
+++ b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Lifetime.cs
@@ -7,10 +7,10 @@ using System.Reactive;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using Microsoft.Reactive.Testing;
-using Avalonia.Markup.Data;
+using Avalonia.Data.Core;
using Xunit;
-namespace Avalonia.Markup.UnitTests.Data
+namespace Avalonia.Base.UnitTests.Data.Core
{
public class ExpressionObserverTests_Lifetime
{
diff --git a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Method.cs b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Method.cs
similarity index 97%
rename from tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Method.cs
rename to tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Method.cs
index 439e9dc542..ef89c2b4bd 100644
--- a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Method.cs
+++ b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Method.cs
@@ -1,5 +1,5 @@
using Avalonia.Data;
-using Avalonia.Markup.Data;
+using Avalonia.Data.Core;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -8,7 +8,7 @@ using System.Text;
using System.Threading.Tasks;
using Xunit;
-namespace Avalonia.Markup.UnitTests.Data
+namespace Avalonia.Base.UnitTests.Data.Core
{
public class ExpressionObserverTests_Method
{
diff --git a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Negation.cs b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Negation.cs
similarity index 98%
rename from tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Negation.cs
rename to tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Negation.cs
index f4aa85c393..556352f6ca 100644
--- a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Negation.cs
+++ b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Negation.cs
@@ -5,10 +5,10 @@ using System;
using System.Reactive.Linq;
using System.Threading.Tasks;
using Avalonia.Data;
-using Avalonia.Markup.Data;
+using Avalonia.Data.Core;
using Xunit;
-namespace Avalonia.Markup.UnitTests.Data
+namespace Avalonia.Base.UnitTests.Data.Core
{
public class ExpressionObserverTests_Negation
{
diff --git a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Observable.cs b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Observable.cs
similarity index 98%
rename from tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Observable.cs
rename to tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Observable.cs
index aa78c100c1..f1c39617eb 100644
--- a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Observable.cs
+++ b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Observable.cs
@@ -6,11 +6,11 @@ using System.Collections.Generic;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using Avalonia.Data;
-using Avalonia.Markup.Data;
+using Avalonia.Data.Core;
using Avalonia.UnitTests;
using Xunit;
-namespace Avalonia.Markup.UnitTests.Data
+namespace Avalonia.Base.UnitTests.Data.Core
{
public class ExpressionObserverTests_Observable
{
diff --git a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Property.cs b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Property.cs
similarity index 99%
rename from tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Property.cs
rename to tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Property.cs
index 60174e65e6..a3cb11114a 100644
--- a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Property.cs
+++ b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Property.cs
@@ -8,12 +8,12 @@ using System.Reactive.Linq;
using System.Reactive.Subjects;
using Microsoft.Reactive.Testing;
using Avalonia.Data;
-using Avalonia.Markup.Data;
+using Avalonia.Data.Core;
using Avalonia.UnitTests;
using Xunit;
using System.Threading.Tasks;
-namespace Avalonia.Markup.UnitTests.Data
+namespace Avalonia.Base.UnitTests.Data.Core
{
public class ExpressionObserverTests_Property
{
@@ -363,7 +363,7 @@ namespace Avalonia.Markup.UnitTests.Data
{
"bar",
new BindingNotification(
- new MissingMemberException("Could not find CLR property 'Bar' on 'Avalonia.Markup.UnitTests.Data.ExpressionObserverTests_Property+WithoutBar'"),
+ new MissingMemberException("Could not find CLR property 'Bar' on 'Avalonia.Base.UnitTests.Data.Core.ExpressionObserverTests_Property+WithoutBar'"),
BindingErrorType.Error),
"baz",
},
diff --git a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_SetValue.cs b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_SetValue.cs
similarity index 97%
rename from tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_SetValue.cs
rename to tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_SetValue.cs
index 0705ae9c5a..a163229e26 100644
--- a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_SetValue.cs
+++ b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_SetValue.cs
@@ -4,11 +4,11 @@
using System;
using System.Reactive.Linq;
using System.Reactive.Subjects;
-using Avalonia.Markup.Data;
+using Avalonia.Data.Core;
using Avalonia.UnitTests;
using Xunit;
-namespace Avalonia.Markup.UnitTests.Data
+namespace Avalonia.Base.UnitTests.Data.Core
{
public class ExpressionObserverTests_SetValue
{
diff --git a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Task.cs b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Task.cs
similarity index 98%
rename from tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Task.cs
rename to tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Task.cs
index 87a8be045b..3b9a23f846 100644
--- a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Task.cs
+++ b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Task.cs
@@ -6,11 +6,11 @@ using System.Collections.Generic;
using System.Reactive.Linq;
using System.Threading.Tasks;
using Avalonia.Data;
-using Avalonia.Markup.Data;
+using Avalonia.Data.Core;
using Avalonia.UnitTests;
using Xunit;
-namespace Avalonia.Markup.UnitTests.Data
+namespace Avalonia.Base.UnitTests.Data.Core
{
public class ExpressionObserverTests_Task
{
diff --git a/tests/Avalonia.Markup.UnitTests/Data/IndeiBase.cs b/tests/Avalonia.Base.UnitTests/Data/Core/IndeiBase.cs
similarity index 96%
rename from tests/Avalonia.Markup.UnitTests/Data/IndeiBase.cs
rename to tests/Avalonia.Base.UnitTests/Data/Core/IndeiBase.cs
index bd0ab71626..6edcdc820d 100644
--- a/tests/Avalonia.Markup.UnitTests/Data/IndeiBase.cs
+++ b/tests/Avalonia.Base.UnitTests/Data/Core/IndeiBase.cs
@@ -7,7 +7,7 @@ using System.ComponentModel;
using System.Runtime.CompilerServices;
using Avalonia.UnitTests;
-namespace Avalonia.Markup.UnitTests.Data
+namespace Avalonia.Base.UnitTests.Data.Core
{
internal abstract class IndeiBase : NotifyingBase, INotifyDataErrorInfo
{
diff --git a/tests/Avalonia.Markup.UnitTests/Data/Plugins/DataAnnotationsValidationPluginTests.cs b/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/DataAnnotationsValidationPluginTests.cs
similarity index 99%
rename from tests/Avalonia.Markup.UnitTests/Data/Plugins/DataAnnotationsValidationPluginTests.cs
rename to tests/Avalonia.Base.UnitTests/Data/Core/Plugins/DataAnnotationsValidationPluginTests.cs
index 6663457add..2bffb7b84a 100644
--- a/tests/Avalonia.Markup.UnitTests/Data/Plugins/DataAnnotationsValidationPluginTests.cs
+++ b/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/DataAnnotationsValidationPluginTests.cs
@@ -5,7 +5,7 @@ using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Avalonia.Data;
-using Avalonia.Markup.Data.Plugins;
+using Avalonia.Data.Core.Plugins;
using Avalonia.UnitTests;
using Xunit;
diff --git a/tests/Avalonia.Markup.UnitTests/Data/Plugins/ExceptionValidationPluginTests.cs b/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/ExceptionValidationPluginTests.cs
similarity index 96%
rename from tests/Avalonia.Markup.UnitTests/Data/Plugins/ExceptionValidationPluginTests.cs
rename to tests/Avalonia.Base.UnitTests/Data/Core/Plugins/ExceptionValidationPluginTests.cs
index eb529a3b13..2a307f9a61 100644
--- a/tests/Avalonia.Markup.UnitTests/Data/Plugins/ExceptionValidationPluginTests.cs
+++ b/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/ExceptionValidationPluginTests.cs
@@ -5,11 +5,11 @@ using System;
using System.Collections.Generic;
using System.Reactive.Linq;
using Avalonia.Data;
-using Avalonia.Markup.Data.Plugins;
+using Avalonia.Data.Core.Plugins;
using Avalonia.UnitTests;
using Xunit;
-namespace Avalonia.Markup.UnitTests.Data.Plugins
+namespace Avalonia.Base.UnitTests.Data.Core.Plugins
{
public class ExceptionValidationPluginTests
{
diff --git a/tests/Avalonia.Markup.UnitTests/Data/Plugins/IndeiValidationPluginTests.cs b/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/IndeiValidationPluginTests.cs
similarity index 98%
rename from tests/Avalonia.Markup.UnitTests/Data/Plugins/IndeiValidationPluginTests.cs
rename to tests/Avalonia.Base.UnitTests/Data/Core/Plugins/IndeiValidationPluginTests.cs
index 788bc25a34..45c084014b 100644
--- a/tests/Avalonia.Markup.UnitTests/Data/Plugins/IndeiValidationPluginTests.cs
+++ b/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/IndeiValidationPluginTests.cs
@@ -6,10 +6,10 @@ using System.Collections;
using System.Collections.Generic;
using System.Reactive.Linq;
using Avalonia.Data;
-using Avalonia.Markup.Data.Plugins;
+using Avalonia.Data.Core.Plugins;
using Xunit;
-namespace Avalonia.Markup.UnitTests.Data.Plugins
+namespace Avalonia.Base.UnitTests.Data.Core.Plugins
{
public class IndeiValidationPluginTests
{
diff --git a/tests/Avalonia.Markup.UnitTests/DefaultValueConverterTests.cs b/tests/Avalonia.Base.UnitTests/Data/DefaultValueConverterTests.cs
similarity index 98%
rename from tests/Avalonia.Markup.UnitTests/DefaultValueConverterTests.cs
rename to tests/Avalonia.Base.UnitTests/Data/DefaultValueConverterTests.cs
index 0aa2e00c0f..eeb502d730 100644
--- a/tests/Avalonia.Markup.UnitTests/DefaultValueConverterTests.cs
+++ b/tests/Avalonia.Base.UnitTests/Data/DefaultValueConverterTests.cs
@@ -7,8 +7,9 @@ using Avalonia.Data;
using Xunit;
using System.Windows.Input;
using System;
+using Avalonia.Data.Converters;
-namespace Avalonia.Markup.UnitTests
+namespace Avalonia.Base.UnitTests.Data.Converters
{
public class DefaultValueConverterTests
{
diff --git a/tests/Avalonia.Markup.UnitTests/UnitTestSynchronizationContext.cs b/tests/Avalonia.Base.UnitTests/Data/UnitTestSynchronizationContext.cs
similarity index 98%
rename from tests/Avalonia.Markup.UnitTests/UnitTestSynchronizationContext.cs
rename to tests/Avalonia.Base.UnitTests/Data/UnitTestSynchronizationContext.cs
index b5068c511d..838aee6528 100644
--- a/tests/Avalonia.Markup.UnitTests/UnitTestSynchronizationContext.cs
+++ b/tests/Avalonia.Base.UnitTests/Data/UnitTestSynchronizationContext.cs
@@ -6,7 +6,7 @@ using System.Collections.Generic;
using System.Reactive.Disposables;
using System.Threading;
-namespace Avalonia.Markup.UnitTests
+namespace Avalonia.Base.UnitTests.Data
{
internal sealed class UnitTestSynchronizationContext : SynchronizationContext
{
diff --git a/tests/Avalonia.Controls.UnitTests/AutoCompleteBoxTests.cs b/tests/Avalonia.Controls.UnitTests/AutoCompleteBoxTests.cs
index f9da2ab6f3..b10929cbdc 100644
--- a/tests/Avalonia.Controls.UnitTests/AutoCompleteBoxTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/AutoCompleteBoxTests.cs
@@ -10,7 +10,7 @@ using Avalonia.Controls.Primitives;
using Avalonia.Controls.Presenters;
using Avalonia.Controls.Templates;
using Avalonia.Data;
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Markup.Data;
using Avalonia.Platform;
using Avalonia.Threading;
using Avalonia.UnitTests;
diff --git a/tests/Avalonia.Controls.UnitTests/ButtonTests.cs b/tests/Avalonia.Controls.UnitTests/ButtonTests.cs
index 71bf9104f7..d218960726 100644
--- a/tests/Avalonia.Controls.UnitTests/ButtonTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/ButtonTests.cs
@@ -1,6 +1,7 @@
using System;
using System.Windows.Input;
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Data;
+using Avalonia.Markup.Data;
using Xunit;
namespace Avalonia.Controls.UnitTests
diff --git a/tests/Avalonia.Controls.UnitTests/ContentControlTests.cs b/tests/Avalonia.Controls.UnitTests/ContentControlTests.cs
index 653ab17b63..c17893604c 100644
--- a/tests/Avalonia.Controls.UnitTests/ContentControlTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/ContentControlTests.cs
@@ -12,7 +12,7 @@ using Avalonia.Styling;
using Avalonia.UnitTests;
using Avalonia.VisualTree;
using Xunit;
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Markup.Data;
using Avalonia.Data;
using System.Collections.Generic;
diff --git a/tests/Avalonia.Controls.UnitTests/DatePickerTests.cs b/tests/Avalonia.Controls.UnitTests/DatePickerTests.cs
index fe4f1ea06e..936d700ad0 100644
--- a/tests/Avalonia.Controls.UnitTests/DatePickerTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/DatePickerTests.cs
@@ -10,7 +10,7 @@ using Avalonia.Controls.Primitives;
using Avalonia.Controls.Presenters;
using Avalonia.Controls.Templates;
using Avalonia.Data;
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Markup.Data;
using Avalonia.Platform;
using Avalonia.UnitTests;
using Moq;
diff --git a/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs b/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs
index 50610cf595..4da803353e 100644
--- a/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs
@@ -74,7 +74,7 @@ namespace Avalonia.Controls.UnitTests
root.Content = target;
var templatedParent = new Button();
- target.TemplatedParent = templatedParent;
+ target.SetValue(StyledElement.TemplatedParentProperty, templatedParent);
target.Template = GetTemplate();
target.Items = new[] { "Foo" };
@@ -360,7 +360,7 @@ namespace Avalonia.Controls.UnitTests
var presenter = new ItemsPresenter
{
- TemplatedParent = target,
+ [StyledElement.TemplatedParentProperty] = target,
[~ItemsPresenter.ItemsProperty] = target[~ItemsControl.ItemsProperty],
};
diff --git a/tests/Avalonia.Controls.UnitTests/ListBoxTests_Single.cs b/tests/Avalonia.Controls.UnitTests/ListBoxTests_Single.cs
index fee4994ee3..70d59e82c8 100644
--- a/tests/Avalonia.Controls.UnitTests/ListBoxTests_Single.cs
+++ b/tests/Avalonia.Controls.UnitTests/ListBoxTests_Single.cs
@@ -9,7 +9,7 @@ using Avalonia.Controls.Templates;
using Avalonia.Data;
using Avalonia.Input;
using Avalonia.LogicalTree;
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Markup.Data;
using Avalonia.Styling;
using Avalonia.VisualTree;
using Xunit;
diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/CarouselPresenterTests.cs b/tests/Avalonia.Controls.UnitTests/Presenters/CarouselPresenterTests.cs
index a50fe852c3..c5ff64b0e3 100644
--- a/tests/Avalonia.Controls.UnitTests/Presenters/CarouselPresenterTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/Presenters/CarouselPresenterTests.cs
@@ -43,7 +43,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
var parent = new TestItemsControl();
var target = new CarouselPresenter
{
- TemplatedParent = parent,
+ [StyledElement.TemplatedParentProperty] = parent,
};
Assert.IsType>(target.ItemContainerGenerator);
diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests.cs
index 048cdb2ccb..3d13e4c32f 100644
--- a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests.cs
@@ -69,7 +69,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
var parent = new TestItemsControl();
var target = new ItemsPresenter
{
- TemplatedParent = parent,
+ [StyledElement.TemplatedParentProperty] = parent,
};
Assert.IsType>(target.ItemContainerGenerator);
diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/RangeBaseTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/RangeBaseTests.cs
index 2dfb30a9f0..42578c61ac 100644
--- a/tests/Avalonia.Controls.UnitTests/Primitives/RangeBaseTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/Primitives/RangeBaseTests.cs
@@ -6,7 +6,7 @@ using System.ComponentModel;
using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates;
using Avalonia.Data;
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Markup.Data;
using Avalonia.Styling;
using Xunit;
diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs
index a60074fa43..c052b81309 100644
--- a/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs
@@ -8,9 +8,10 @@ using Avalonia.Collections;
using Avalonia.Controls.Presenters;
using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates;
+using Avalonia.Data;
using Avalonia.Input;
using Avalonia.Interactivity;
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Markup.Data;
using Avalonia.UnitTests;
using Xunit;
diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests_Multiple.cs b/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests_Multiple.cs
index 642f594e4d..3c6b278e07 100644
--- a/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests_Multiple.cs
+++ b/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests_Multiple.cs
@@ -10,7 +10,7 @@ using Avalonia.Controls.Presenters;
using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates;
using Avalonia.Data;
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Markup.Data;
using Xunit;
namespace Avalonia.Controls.UnitTests.Primitives
diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/ToggleButtonTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/ToggleButtonTests.cs
index db60d05a34..ab74d5e7d6 100644
--- a/tests/Avalonia.Controls.UnitTests/Primitives/ToggleButtonTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/Primitives/ToggleButtonTests.cs
@@ -1,4 +1,5 @@
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Data;
+using Avalonia.Markup.Data;
using Avalonia.UnitTests;
using Xunit;
diff --git a/tests/Avalonia.Controls.UnitTests/RadioButtonTests.cs b/tests/Avalonia.Controls.UnitTests/RadioButtonTests.cs
index 37fb52beeb..2d9dca93f5 100644
--- a/tests/Avalonia.Controls.UnitTests/RadioButtonTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/RadioButtonTests.cs
@@ -1,4 +1,4 @@
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Markup.Data;
using Avalonia.UnitTests;
using Xunit;
diff --git a/tests/Avalonia.Controls.UnitTests/Templates/TemplateExtensionsTests.cs b/tests/Avalonia.Controls.UnitTests/Templates/TemplateExtensionsTests.cs
index 983b7f7c70..df8a0f723a 100644
--- a/tests/Avalonia.Controls.UnitTests/Templates/TemplateExtensionsTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/Templates/TemplateExtensionsTests.cs
@@ -18,12 +18,20 @@ namespace Avalonia.Controls.Templates.UnitTests
public void GetTemplateChildren_Should_Not_Return_Nested_Template_Controls()
{
var target = new TestTemplatedControl();
- var border1 = new Border { Name = "border1", TemplatedParent = target };
- var inner = new TestTemplatedControl { Name = "inner", TemplatedParent = target };
- var border2 = new Border { Name = "border2", TemplatedParent = inner };
- var border3 = new Border { Name = "border3", TemplatedParent = inner };
- var border4 = new Border { Name = "border4", TemplatedParent = target };
- var border5 = new Border { Name = "border5", TemplatedParent = null };
+ var border1 = new Border
+ {
+ Name = "border1",
+ [StyledElement.TemplatedParentProperty] = target,
+ };
+ var inner = new TestTemplatedControl
+ {
+ Name = "inner",
+ [StyledElement.TemplatedParentProperty] = target,
+ };
+ var border2 = new Border { Name = "border2", [StyledElement.TemplatedParentProperty] = inner };
+ var border3 = new Border { Name = "border3", [StyledElement.TemplatedParentProperty] = inner };
+ var border4 = new Border { Name = "border4", [StyledElement.TemplatedParentProperty] = target };
+ var border5 = new Border { Name = "border5", [StyledElement.TemplatedParentProperty] = null };
target.AddVisualChild(border1);
border1.Child = inner;
diff --git a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs
index 5ddc8e71e7..af461f07a4 100644
--- a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs
@@ -8,7 +8,7 @@ using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates;
using Avalonia.Data;
using Avalonia.Input;
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Markup.Data;
using Avalonia.Media;
using Avalonia.Platform;
using Avalonia.UnitTests;
diff --git a/tests/Avalonia.Controls.UnitTests/TextBoxTests_DataValidation.cs b/tests/Avalonia.Controls.UnitTests/TextBoxTests_DataValidation.cs
index 851d741eae..4d79dd557e 100644
--- a/tests/Avalonia.Controls.UnitTests/TextBoxTests_DataValidation.cs
+++ b/tests/Avalonia.Controls.UnitTests/TextBoxTests_DataValidation.cs
@@ -9,7 +9,7 @@ using System.Linq;
using Avalonia.Controls.Presenters;
using Avalonia.Controls.Templates;
using Avalonia.Data;
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Markup.Data;
using Avalonia.Platform;
using Avalonia.UnitTests;
using Moq;
diff --git a/tests/Avalonia.Controls.UnitTests/TreeViewTests.cs b/tests/Avalonia.Controls.UnitTests/TreeViewTests.cs
index 625d9eb26e..a7263cacbd 100644
--- a/tests/Avalonia.Controls.UnitTests/TreeViewTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/TreeViewTests.cs
@@ -8,6 +8,7 @@ using Avalonia.Collections;
using Avalonia.Controls.Presenters;
using Avalonia.Controls.Templates;
using Avalonia.Data;
+using Avalonia.Data.Core;
using Avalonia.Input;
using Avalonia.LogicalTree;
using Avalonia.Markup.Data;
diff --git a/tests/Avalonia.Controls.UnitTests/Utils/AncestorFinderTests.cs b/tests/Avalonia.Controls.UnitTests/Utils/AncestorFinderTests.cs
index 2f05e11dfc..91a6e2948c 100644
--- a/tests/Avalonia.Controls.UnitTests/Utils/AncestorFinderTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/Utils/AncestorFinderTests.cs
@@ -19,7 +19,7 @@ namespace Avalonia.Controls.UnitTests.Utils
var grandParent = new Border();
var grandParent2 = new Border();
- IVisual currentParent = null;
+ IStyledElement currentParent = null;
var subscription = AncestorFinder.Create(child, typeof (Border)).Subscribe(s => currentParent = s);
Assert.Null(currentParent);
diff --git a/tests/Avalonia.LeakTests/ControlTests.cs b/tests/Avalonia.LeakTests/ControlTests.cs
index fe3ad59bb4..6993e32515 100644
--- a/tests/Avalonia.LeakTests/ControlTests.cs
+++ b/tests/Avalonia.LeakTests/ControlTests.cs
@@ -185,7 +185,7 @@ namespace Avalonia.LeakTests
Content = new TextBox()
};
- var binding = new Avalonia.Markup.Xaml.Data.Binding
+ var binding = new Avalonia.Data.Binding
{
Path = "Name"
};
diff --git a/tests/Avalonia.LeakTests/ExpressionObserverTests.cs b/tests/Avalonia.LeakTests/ExpressionObserverTests.cs
index d0f892bebb..96f9e37897 100644
--- a/tests/Avalonia.LeakTests/ExpressionObserverTests.cs
+++ b/tests/Avalonia.LeakTests/ExpressionObserverTests.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using Avalonia.Collections;
+using Avalonia.Data.Core;
using Avalonia.Markup.Data;
using Avalonia.UnitTests;
using JetBrains.dotMemoryUnit;
diff --git a/tests/Avalonia.Markup.UnitTests/Data/BindingTests.cs b/tests/Avalonia.Markup.UnitTests/Data/BindingTests.cs
new file mode 100644
index 0000000000..82b57224f0
--- /dev/null
+++ b/tests/Avalonia.Markup.UnitTests/Data/BindingTests.cs
@@ -0,0 +1,548 @@
+// Copyright (c) The Avalonia Project. All rights reserved.
+// Licensed under the MIT license. See licence.md file in the project root for full license information.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reactive.Linq;
+using Avalonia.Controls;
+using Avalonia.Data;
+using Avalonia.Markup.Data;
+using Moq;
+using Xunit;
+using System.ComponentModel;
+using System.Runtime.CompilerServices;
+using Avalonia.UnitTests;
+using Avalonia.Data.Converters;
+using Avalonia.Data.Core;
+
+namespace Avalonia.Markup.UnitTests.Data
+{
+ public class BindingTests
+ {
+ [Fact]
+ public void OneWay_Binding_Should_Be_Set_Up()
+ {
+ var source = new Source { Foo = "foo" };
+ var target = new TextBlock { DataContext = source };
+ var binding = new Binding
+ {
+ Path = "Foo",
+ Mode = BindingMode.OneWay,
+ };
+
+ target.Bind(TextBox.TextProperty, binding);
+
+ Assert.Equal("foo", target.Text);
+ source.Foo = "bar";
+ Assert.Equal("bar", target.Text);
+ target.Text = "baz";
+ Assert.Equal("bar", source.Foo);
+ }
+
+ [Fact]
+ public void TwoWay_Binding_Should_Be_Set_Up()
+ {
+ var source = new Source { Foo = "foo" };
+ var target = new TextBlock { DataContext = source };
+ var binding = new Binding
+ {
+ Path = "Foo",
+ Mode = BindingMode.TwoWay,
+ };
+
+ target.Bind(TextBox.TextProperty, binding);
+
+ Assert.Equal("foo", target.Text);
+ source.Foo = "bar";
+ Assert.Equal("bar", target.Text);
+ target.Text = "baz";
+ Assert.Equal("baz", source.Foo);
+ }
+
+ [Fact]
+ public void OneTime_Binding_Should_Be_Set_Up()
+ {
+ var source = new Source { Foo = "foo" };
+ var target = new TextBlock { DataContext = source };
+ var binding = new Binding
+ {
+ Path = "Foo",
+ Mode = BindingMode.OneTime,
+ };
+
+ target.Bind(TextBox.TextProperty, binding);
+
+ Assert.Equal("foo", target.Text);
+ source.Foo = "bar";
+ Assert.Equal("foo", target.Text);
+ target.Text = "baz";
+ Assert.Equal("bar", source.Foo);
+ }
+
+ [Fact]
+ public void OneWayToSource_Binding_Should_Be_Set_Up()
+ {
+ var source = new Source { Foo = "foo" };
+ var target = new TextBlock { DataContext = source, Text = "bar" };
+ var binding = new Binding
+ {
+ Path = "Foo",
+ Mode = BindingMode.OneWayToSource,
+ };
+
+ target.Bind(TextBox.TextProperty, binding);
+
+ Assert.Equal("bar", source.Foo);
+ target.Text = "baz";
+ Assert.Equal("baz", source.Foo);
+ source.Foo = "quz";
+ Assert.Equal("baz", target.Text);
+ }
+
+ [Fact]
+ public void Default_BindingMode_Should_Be_Used()
+ {
+ var source = new Source { Foo = "foo" };
+ var target = new TwoWayBindingTest { DataContext = source };
+ var binding = new Binding
+ {
+ Path = "Foo",
+ };
+
+ target.Bind(TwoWayBindingTest.TwoWayProperty, binding);
+
+ Assert.Equal("foo", target.TwoWay);
+ source.Foo = "bar";
+ Assert.Equal("bar", target.TwoWay);
+ target.TwoWay = "baz";
+ Assert.Equal("baz", source.Foo);
+ }
+
+ [Fact]
+ public void DataContext_Binding_Should_Use_Parent_DataContext()
+ {
+ var parentDataContext = Mock.Of(x => x.Header == (object)"Foo");
+
+ var parent = new Decorator
+ {
+ Child = new Control(),
+ DataContext = parentDataContext,
+ };
+
+ var binding = new Binding
+ {
+ Path = "Header",
+ };
+
+ parent.Child.Bind(Control.DataContextProperty, binding);
+
+ Assert.Equal("Foo", parent.Child.DataContext);
+
+ parentDataContext = Mock.Of(x => x.Header == (object)"Bar");
+ parent.DataContext = parentDataContext;
+ Assert.Equal("Bar", parent.Child.DataContext);
+ }
+
+ [Fact]
+ public void DataContext_Binding_Should_Track_Parent()
+ {
+ var parent = new Decorator
+ {
+ DataContext = new { Foo = "foo" },
+ };
+
+ var child = new Control();
+
+ var binding = new Binding
+ {
+ Path = "Foo",
+ };
+
+ child.Bind(Control.DataContextProperty, binding);
+
+ Assert.Null(child.DataContext);
+ parent.Child = child;
+ Assert.Equal("foo", child.DataContext);
+ }
+
+ [Fact]
+ public void DataContext_Binding_Should_Produce_Correct_Results()
+ {
+ var viewModel = new { Foo = "bar" };
+ var root = new Decorator
+ {
+ DataContext = viewModel,
+ };
+
+ var child = new Control();
+ var values = new List();
+
+ child.GetObservable(Control.DataContextProperty).Subscribe(x => values.Add(x));
+ child.Bind(Control.DataContextProperty, new Binding("Foo"));
+
+ // When binding to DataContext and the target isn't found, the binding should produce
+ // null rather than UnsetValue in order to not propagate incorrect DataContexts from
+ // parent controls while things are being set up. This logic is implemented in
+ // `Avalonia.Markup.Data.Binding.Initiate`.
+ Assert.True(child.IsSet(Control.DataContextProperty));
+
+ root.Child = child;
+
+ Assert.Equal(new[] { null, "bar" }, values);
+ }
+
+ [Fact]
+ public void Should_Use_DefaultValueConverter_When_No_Converter_Specified()
+ {
+ var target = new TextBlock(); ;
+ var binding = new Binding
+ {
+ Path = "Foo",
+ };
+
+ var result = binding.Initiate(target, TextBox.TextProperty).Subject;
+
+ Assert.IsType(((BindingExpression)result).Converter);
+ }
+
+ [Fact]
+ public void Should_Use_Supplied_Converter()
+ {
+ var target = new TextBlock();
+ var converter = new Mock();
+ var binding = new Binding
+ {
+ Converter = converter.Object,
+ Path = "Foo",
+ };
+
+ var result = binding.Initiate(target, TextBox.TextProperty).Subject;
+
+ Assert.Same(converter.Object, ((BindingExpression)result).Converter);
+ }
+
+ [Fact]
+ public void Should_Pass_ConverterParameter_To_Supplied_Converter()
+ {
+ var target = new TextBlock();
+ var converter = new Mock();
+ var binding = new Binding
+ {
+ Converter = converter.Object,
+ ConverterParameter = "foo",
+ Path = "Bar",
+ };
+
+ var result = binding.Initiate(target, TextBox.TextProperty).Subject;
+
+ Assert.Same("foo", ((BindingExpression)result).ConverterParameter);
+ }
+
+ [Fact]
+ public void Should_Return_FallbackValue_When_Path_Not_Resolved()
+ {
+ var target = new TextBlock();
+ var source = new Source();
+ var binding = new Binding
+ {
+ Source = source,
+ Path = "BadPath",
+ FallbackValue = "foofallback",
+ };
+
+ target.Bind(TextBlock.TextProperty, binding);
+
+ Assert.Equal("foofallback", target.Text);
+ }
+
+ [Fact]
+ public void Should_Return_FallbackValue_When_Invalid_Source_Type()
+ {
+ var target = new ProgressBar();
+ var source = new Source { Foo = "foo" };
+ var binding = new Binding
+ {
+ Source = source,
+ Path = "Foo",
+ FallbackValue = 42,
+ };
+
+ target.Bind(ProgressBar.ValueProperty, binding);
+
+ Assert.Equal(42, target.Value);
+ }
+
+ ///
+ /// Tests a problem discovered with ListBox with selection.
+ ///
+ ///
+ /// - Items is bound to DataContext first, followed by say SelectedIndex
+ /// - When the ListBox is removed from the logical tree, DataContext becomes null (as it's
+ /// inherited)
+ /// - This changes Items to null, which changes SelectedIndex to null as there are no
+ /// longer any items
+ /// - However, the news that DataContext is now null hasn't yet reached the SelectedIndex
+ /// binding and so the unselection is sent back to the ViewModel
+ ///
+ [Fact]
+ public void Should_Not_Write_To_Old_DataContext()
+ {
+ var vm = new OldDataContextViewModel();
+ var target = new OldDataContextTest();
+
+ var fooBinding = new Binding
+ {
+ Path = "Foo",
+ Mode = BindingMode.TwoWay,
+ };
+
+ var barBinding = new Binding
+ {
+ Path = "Bar",
+ Mode = BindingMode.TwoWay,
+ };
+
+ // Bind Foo and Bar to the VM.
+ target.Bind(OldDataContextTest.FooProperty, fooBinding);
+ target.Bind(OldDataContextTest.BarProperty, barBinding);
+ target.DataContext = vm;
+
+ // Make sure the control's Foo and Bar properties are read from the VM
+ Assert.Equal(1, target.GetValue(OldDataContextTest.FooProperty));
+ Assert.Equal(2, target.GetValue(OldDataContextTest.BarProperty));
+
+ // Set DataContext to null.
+ target.DataContext = null;
+
+ // Foo and Bar are no longer bound so they return 0, their default value.
+ Assert.Equal(0, target.GetValue(OldDataContextTest.FooProperty));
+ Assert.Equal(0, target.GetValue(OldDataContextTest.BarProperty));
+
+ // The problem was here - DataContext is now null, setting Foo to 0. Bar is bound to
+ // Foo so Bar also gets set to 0. However the Bar binding still had a reference to
+ // the VM and so vm.Bar was set to 0 erroneously.
+ Assert.Equal(1, vm.Foo);
+ Assert.Equal(2, vm.Bar);
+ }
+
+ [Fact]
+ public void AvaloniaObject_this_Operator_Accepts_Binding()
+ {
+ var target = new ContentControl
+ {
+ DataContext = new { Foo = "foo" }
+ };
+
+ target[!ContentControl.ContentProperty] = new Binding("Foo");
+
+ Assert.Equal("foo", target.Content);
+ }
+
+ [Fact]
+ public void StyledProperty_SetValue_Should_Not_Cause_StackOverflow_And_Have_Correct_Values()
+ {
+ var viewModel = new TestStackOverflowViewModel()
+ {
+ Value = 50
+ };
+
+ var target = new StyledPropertyClass();
+
+ target.Bind(StyledPropertyClass.DoubleValueProperty,
+ new Binding("Value") { Mode = BindingMode.TwoWay, Source = viewModel });
+
+ var child = new StyledPropertyClass();
+
+ child.Bind(StyledPropertyClass.DoubleValueProperty,
+ new Binding("DoubleValue")
+ {
+ Mode = BindingMode.TwoWay,
+ Source = target
+ });
+
+ Assert.Equal(1, viewModel.SetterInvokedCount);
+
+ //here in real life stack overflow exception is thrown issue #855 and #824
+ target.DoubleValue = 51.001;
+
+ Assert.Equal(2, viewModel.SetterInvokedCount);
+
+ double expected = 51;
+
+ Assert.Equal(expected, viewModel.Value);
+ Assert.Equal(expected, target.DoubleValue);
+ Assert.Equal(expected, child.DoubleValue);
+ }
+
+ [Fact]
+ public void SetValue_Should_Not_Cause_StackOverflow_And_Have_Correct_Values()
+ {
+ var viewModel = new TestStackOverflowViewModel()
+ {
+ Value = 50
+ };
+
+ var target = new DirectPropertyClass();
+
+ target.Bind(DirectPropertyClass.DoubleValueProperty, new Binding("Value")
+ {
+ Mode = BindingMode.TwoWay,
+ Source = viewModel
+ });
+
+ var child = new DirectPropertyClass();
+
+ child.Bind(DirectPropertyClass.DoubleValueProperty,
+ new Binding("DoubleValue")
+ {
+ Mode = BindingMode.TwoWay,
+ Source = target
+ });
+
+ Assert.Equal(1, viewModel.SetterInvokedCount);
+
+ //here in real life stack overflow exception is thrown issue #855 and #824
+ target.DoubleValue = 51.001;
+
+ Assert.Equal(2, viewModel.SetterInvokedCount);
+
+ double expected = 51;
+
+ Assert.Equal(expected, viewModel.Value);
+ Assert.Equal(expected, target.DoubleValue);
+ Assert.Equal(expected, child.DoubleValue);
+ }
+
+ private class StyledPropertyClass : AvaloniaObject
+ {
+ public static readonly StyledProperty DoubleValueProperty =
+ AvaloniaProperty.Register(nameof(DoubleValue));
+
+ public double DoubleValue
+ {
+ get { return GetValue(DoubleValueProperty); }
+ set { SetValue(DoubleValueProperty, value); }
+ }
+ }
+
+ private class DirectPropertyClass : AvaloniaObject
+ {
+ public static readonly DirectProperty DoubleValueProperty =
+ AvaloniaProperty.RegisterDirect(
+ nameof(DoubleValue),
+ o => o.DoubleValue,
+ (o, v) => o.DoubleValue = v);
+
+ private double _doubleValue;
+ public double DoubleValue
+ {
+ get { return _doubleValue; }
+ set { SetAndRaise(DoubleValueProperty, ref _doubleValue, value); }
+ }
+ }
+
+ private class TestStackOverflowViewModel : INotifyPropertyChanged
+ {
+ public int SetterInvokedCount { get; private set; }
+
+ public const int MaxInvokedCount = 1000;
+
+ private double _value;
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ public double Value
+ {
+ get { return _value; }
+ set
+ {
+ if (_value != value)
+ {
+ SetterInvokedCount++;
+ if (SetterInvokedCount < MaxInvokedCount)
+ {
+ _value = (int)value;
+ if (_value > 75) _value = 75;
+ if (_value < 25) _value = 25;
+ }
+ else
+ {
+ _value = value;
+ }
+
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Value)));
+ }
+ }
+ }
+ }
+
+ private class TwoWayBindingTest : Control
+ {
+ public static readonly StyledProperty TwoWayProperty =
+ AvaloniaProperty.Register(
+ "TwoWay",
+ defaultBindingMode: BindingMode.TwoWay);
+
+ public string TwoWay
+ {
+ get { return GetValue(TwoWayProperty); }
+ set { SetValue(TwoWayProperty, value); }
+ }
+ }
+
+ public class Source : INotifyPropertyChanged
+ {
+ private string _foo;
+
+ public string Foo
+ {
+ get { return _foo; }
+ set
+ {
+ _foo = value;
+ RaisePropertyChanged();
+ }
+ }
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ private void RaisePropertyChanged([CallerMemberName] string prop = "")
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
+ }
+ }
+
+ private class OldDataContextViewModel
+ {
+ public int Foo { get; set; } = 1;
+ public int Bar { get; set; } = 2;
+ }
+
+ private class OldDataContextTest : Control
+ {
+ public static readonly StyledProperty FooProperty =
+ AvaloniaProperty.Register("Foo");
+
+ public static readonly StyledProperty BarProperty =
+ AvaloniaProperty.Register("Bar");
+
+ public OldDataContextTest()
+ {
+ Bind(BarProperty, this.GetObservable(FooProperty));
+ }
+ }
+
+ private class InheritanceTest : Decorator
+ {
+ public static readonly StyledProperty BazProperty =
+ AvaloniaProperty.Register(nameof(Baz), defaultValue: 6, inherits: true);
+
+ public int Baz
+ {
+ get { return GetValue(BazProperty); }
+ set { SetValue(BazProperty, value); }
+ }
+ }
+ }
+}
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_DataValidation.cs b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_DataValidation.cs
similarity index 96%
rename from tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_DataValidation.cs
rename to tests/Avalonia.Markup.UnitTests/Data/BindingTests_DataValidation.cs
index 5dd8d0cdf9..04b91b5f6a 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_DataValidation.cs
+++ b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_DataValidation.cs
@@ -5,11 +5,11 @@ using System;
using System.Reactive.Linq;
using Avalonia.Controls;
using Avalonia.Data;
+using Avalonia.Data.Core;
using Avalonia.Markup.Data;
-using Avalonia.Markup.Xaml.Data;
using Xunit;
-namespace Avalonia.Markup.Xaml.UnitTests.Data
+namespace Avalonia.Markup.UnitTests.Data
{
public class BindingTests_DataValidation
{
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_ElementName.cs b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_ElementName.cs
similarity index 97%
rename from tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_ElementName.cs
rename to tests/Avalonia.Markup.UnitTests/Data/BindingTests_ElementName.cs
index d582964987..61df0bffdf 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_ElementName.cs
+++ b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_ElementName.cs
@@ -2,11 +2,12 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using Avalonia.Controls;
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Data;
+using Avalonia.Markup.Data;
using Avalonia.UnitTests;
using Xunit;
-namespace Avalonia.Markup.Xaml.UnitTests.Data
+namespace Avalonia.Markup.UnitTests.Data
{
public class BindingTests_ElementName
{
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_RelativeSource.cs b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_RelativeSource.cs
similarity index 98%
rename from tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_RelativeSource.cs
rename to tests/Avalonia.Markup.UnitTests/Data/BindingTests_RelativeSource.cs
index c46fb6fce2..f2ddec6f3c 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_RelativeSource.cs
+++ b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_RelativeSource.cs
@@ -2,11 +2,12 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using Avalonia.Controls;
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Data;
+using Avalonia.Markup.Data;
using Avalonia.UnitTests;
using Xunit;
-namespace Avalonia.Markup.Xaml.UnitTests.Data
+namespace Avalonia.Markup.UnitTests.Data
{
public class BindingTests_RelativeSource
{
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_Self.cs b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Self.cs
similarity index 96%
rename from tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_Self.cs
rename to tests/Avalonia.Markup.UnitTests/Data/BindingTests_Self.cs
index e0d16a9563..7b899472bb 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_Self.cs
+++ b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Self.cs
@@ -5,12 +5,12 @@ using System;
using Moq;
using Avalonia.Controls;
using Avalonia.Data;
-using Avalonia.Markup.Xaml.Data;
using Avalonia.Styling;
using Xunit;
using System.Reactive.Disposables;
+using Avalonia.Markup.Data;
-namespace Avalonia.Markup.Xaml.UnitTests.Data
+namespace Avalonia.Markup.UnitTests.Data
{
public class BindingTests_Self
{
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_Source.cs b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Source.cs
similarity index 94%
rename from tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_Source.cs
rename to tests/Avalonia.Markup.UnitTests/Data/BindingTests_Source.cs
index 1fbf8b679d..9cc02539ce 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_Source.cs
+++ b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Source.cs
@@ -5,12 +5,11 @@ using Moq;
using Avalonia.Controls;
using Avalonia.Data;
using Avalonia.Markup.Data;
-using Avalonia.Markup.Xaml.Data;
using Xunit;
using System.ComponentModel;
using System.Runtime.CompilerServices;
-namespace Avalonia.Markup.Xaml.UnitTests.Data
+namespace Avalonia.Markup.UnitTests.Data
{
public class BindingTests_Source
{
diff --git a/tests/Avalonia.Markup.UnitTests/Data/BindingTests_TemplatedParent.cs b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_TemplatedParent.cs
new file mode 100644
index 0000000000..e9c3da5160
--- /dev/null
+++ b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_TemplatedParent.cs
@@ -0,0 +1,76 @@
+// Copyright (c) The Avalonia Project. All rights reserved.
+// Licensed under the MIT license. See licence.md file in the project root for full license information.
+
+using System;
+using System.Reactive.Linq;
+using System.Reactive.Subjects;
+using Moq;
+using Avalonia.Controls;
+using Avalonia.Data;
+using Avalonia.Styling;
+using Xunit;
+using System.Reactive.Disposables;
+using Avalonia.UnitTests;
+using Avalonia.VisualTree;
+using System.Linq;
+using Avalonia.Markup.Data;
+
+namespace Avalonia.Markup.UnitTests.Data
+{
+ public class BindingTests_TemplatedParent
+ {
+ [Fact]
+ public void OneWay_Binding_Should_Be_Set_Up()
+ {
+ var target = CreateTarget();
+ var binding = new Binding
+ {
+ Mode = BindingMode.OneWay,
+ RelativeSource = new RelativeSource(RelativeSourceMode.TemplatedParent),
+ Priority = BindingPriority.TemplatedParent,
+ Path = "Foo",
+ };
+
+ target.Object.Bind(TextBox.TextProperty, binding);
+
+ target.Verify(x => x.Bind(
+ TextBox.TextProperty,
+ It.IsAny>(),
+ BindingPriority.TemplatedParent));
+ }
+
+ [Fact]
+ public void TwoWay_Binding_Should_Be_Set_Up()
+ {
+ var target = CreateTarget();
+ var binding = new Binding
+ {
+ Mode = BindingMode.TwoWay,
+ RelativeSource = new RelativeSource(RelativeSourceMode.TemplatedParent),
+ Priority = BindingPriority.TemplatedParent,
+ Path = "Foo",
+ };
+
+ target.Object.Bind(TextBox.TextProperty, binding);
+
+ target.Verify(x => x.Bind(
+ TextBox.TextProperty,
+ It.IsAny>(),
+ BindingPriority.TemplatedParent));
+ }
+
+ private Mock CreateTarget(
+ ITemplatedControl templatedParent = null,
+ string text = null)
+ {
+ var result = new Mock();
+
+ result.Setup(x => x.GetValue(Control.TemplatedParentProperty)).Returns(templatedParent);
+ result.Setup(x => x.GetValue((AvaloniaProperty)Control.TemplatedParentProperty)).Returns(templatedParent);
+ result.Setup(x => x.GetValue((AvaloniaProperty)TextBox.TextProperty)).Returns(text);
+ result.Setup(x => x.Bind(It.IsAny(), It.IsAny>(), It.IsAny()))
+ .Returns(Disposable.Empty);
+ return result;
+ }
+ }
+}
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Data/MultiBindingTests.cs b/tests/Avalonia.Markup.UnitTests/Data/MultiBindingTests.cs
similarity index 96%
rename from tests/Avalonia.Markup.Xaml.UnitTests/Data/MultiBindingTests.cs
rename to tests/Avalonia.Markup.UnitTests/Data/MultiBindingTests.cs
index 4450cc0c90..fb23a38cce 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/Data/MultiBindingTests.cs
+++ b/tests/Avalonia.Markup.UnitTests/Data/MultiBindingTests.cs
@@ -8,11 +8,12 @@ using System.Linq;
using System.Reactive.Linq;
using Moq;
using Avalonia.Controls;
-using Avalonia.Markup.Xaml.Data;
using Xunit;
using System.Threading.Tasks;
+using Avalonia.Data.Converters;
+using Avalonia.Data;
-namespace Avalonia.Markup.Xaml.UnitTests.Data
+namespace Avalonia.Markup.UnitTests.Data
{
public class MultiBindingTests
{
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Parsers/SelectorGrammarTests.cs b/tests/Avalonia.Markup.UnitTests/Parsers/SelectorGrammarTests.cs
similarity index 98%
rename from tests/Avalonia.Markup.Xaml.UnitTests/Parsers/SelectorGrammarTests.cs
rename to tests/Avalonia.Markup.UnitTests/Parsers/SelectorGrammarTests.cs
index ad2c1bf8d3..8cb2639125 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/Parsers/SelectorGrammarTests.cs
+++ b/tests/Avalonia.Markup.UnitTests/Parsers/SelectorGrammarTests.cs
@@ -2,11 +2,11 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System.Linq;
-using Avalonia.Markup.Xaml.Parsers;
+using Avalonia.Markup.Parsers;
using Sprache;
using Xunit;
-namespace Avalonia.Xaml.Base.UnitTest.Parsers
+namespace Avalonia.Markup.UnitTest.Parsers
{
public class SelectorGrammarTests
{
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Parsers/SelectorParserTests.cs b/tests/Avalonia.Markup.UnitTests/Parsers/SelectorParserTests.cs
similarity index 91%
rename from tests/Avalonia.Markup.Xaml.UnitTests/Parsers/SelectorParserTests.cs
rename to tests/Avalonia.Markup.UnitTests/Parsers/SelectorParserTests.cs
index 8c0b043907..360be7f909 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/Parsers/SelectorParserTests.cs
+++ b/tests/Avalonia.Markup.UnitTests/Parsers/SelectorParserTests.cs
@@ -1,6 +1,6 @@
using System;
using Avalonia.Controls;
-using Avalonia.Markup.Xaml.Parsers;
+using Avalonia.Markup.Parsers;
using Xunit;
namespace Avalonia.Markup.Xaml.UnitTests.Parsers
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests.cs
index c6f89e07a6..0a00b9d39d 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests.cs
+++ b/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests.cs
@@ -8,475 +8,18 @@ using System.Reactive.Linq;
using Avalonia.Controls;
using Avalonia.Data;
using Avalonia.Markup.Data;
-using Avalonia.Markup.Xaml.Data;
using Moq;
using Xunit;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using Avalonia.UnitTests;
+using Avalonia.Data.Converters;
+using Avalonia.Data.Core;
namespace Avalonia.Markup.Xaml.UnitTests.Data
{
public class BindingTests
{
- [Fact]
- public void OneWay_Binding_Should_Be_Set_Up()
- {
- var source = new Source { Foo = "foo" };
- var target = new TextBlock { DataContext = source };
- var binding = new Binding
- {
- Path = "Foo",
- Mode = BindingMode.OneWay,
- };
-
- target.Bind(TextBox.TextProperty, binding);
-
- Assert.Equal("foo", target.Text);
- source.Foo = "bar";
- Assert.Equal("bar", target.Text);
- target.Text = "baz";
- Assert.Equal("bar", source.Foo);
- }
-
- [Fact]
- public void TwoWay_Binding_Should_Be_Set_Up()
- {
- var source = new Source { Foo = "foo" };
- var target = new TextBlock { DataContext = source };
- var binding = new Binding
- {
- Path = "Foo",
- Mode = BindingMode.TwoWay,
- };
-
- target.Bind(TextBox.TextProperty, binding);
-
- Assert.Equal("foo", target.Text);
- source.Foo = "bar";
- Assert.Equal("bar", target.Text);
- target.Text = "baz";
- Assert.Equal("baz", source.Foo);
- }
-
- [Fact]
- public void OneTime_Binding_Should_Be_Set_Up()
- {
- var source = new Source { Foo = "foo" };
- var target = new TextBlock { DataContext = source };
- var binding = new Binding
- {
- Path = "Foo",
- Mode = BindingMode.OneTime,
- };
-
- target.Bind(TextBox.TextProperty, binding);
-
- Assert.Equal("foo", target.Text);
- source.Foo = "bar";
- Assert.Equal("foo", target.Text);
- target.Text = "baz";
- Assert.Equal("bar", source.Foo);
- }
-
- [Fact]
- public void OneWayToSource_Binding_Should_Be_Set_Up()
- {
- var source = new Source { Foo = "foo" };
- var target = new TextBlock { DataContext = source, Text = "bar" };
- var binding = new Binding
- {
- Path = "Foo",
- Mode = BindingMode.OneWayToSource,
- };
-
- target.Bind(TextBox.TextProperty, binding);
-
- Assert.Equal("bar", source.Foo);
- target.Text = "baz";
- Assert.Equal("baz", source.Foo);
- source.Foo = "quz";
- Assert.Equal("baz", target.Text);
- }
-
- [Fact]
- public void Default_BindingMode_Should_Be_Used()
- {
- var source = new Source { Foo = "foo" };
- var target = new TwoWayBindingTest { DataContext = source };
- var binding = new Binding
- {
- Path = "Foo",
- };
-
- target.Bind(TwoWayBindingTest.TwoWayProperty, binding);
-
- Assert.Equal("foo", target.TwoWay);
- source.Foo = "bar";
- Assert.Equal("bar", target.TwoWay);
- target.TwoWay = "baz";
- Assert.Equal("baz", source.Foo);
- }
-
- [Fact]
- public void DataContext_Binding_Should_Use_Parent_DataContext()
- {
- var parentDataContext = Mock.Of(x => x.Header == (object)"Foo");
-
- var parent = new Decorator
- {
- Child = new Control(),
- DataContext = parentDataContext,
- };
-
- var binding = new Binding
- {
- Path = "Header",
- };
-
- parent.Child.Bind(Control.DataContextProperty, binding);
-
- Assert.Equal("Foo", parent.Child.DataContext);
-
- parentDataContext = Mock.Of(x => x.Header == (object)"Bar");
- parent.DataContext = parentDataContext;
- Assert.Equal("Bar", parent.Child.DataContext);
- }
-
- [Fact]
- public void DataContext_Binding_Should_Track_Parent()
- {
- var parent = new Decorator
- {
- DataContext = new { Foo = "foo" },
- };
-
- var child = new Control();
-
- var binding = new Binding
- {
- Path = "Foo",
- };
-
- child.Bind(Control.DataContextProperty, binding);
-
- Assert.Null(child.DataContext);
- parent.Child = child;
- Assert.Equal("foo", child.DataContext);
- }
-
- [Fact]
- public void DataContext_Binding_Should_Produce_Correct_Results()
- {
- var viewModel = new { Foo = "bar" };
- var root = new Decorator
- {
- DataContext = viewModel,
- };
-
- var child = new Control();
- var values = new List();
-
- child.GetObservable(Control.DataContextProperty).Subscribe(x => values.Add(x));
- child.Bind(Control.DataContextProperty, new Binding("Foo"));
-
- // When binding to DataContext and the target isn't found, the binding should produce
- // null rather than UnsetValue in order to not propagate incorrect DataContexts from
- // parent controls while things are being set up. This logic is implemented in
- // `Avalonia.Markup.Xaml.Binding.Initiate`.
- Assert.True(child.IsSet(Control.DataContextProperty));
-
- root.Child = child;
-
- Assert.Equal(new[] { null, "bar" }, values);
- }
-
- [Fact]
- public void Should_Use_DefaultValueConverter_When_No_Converter_Specified()
- {
- var target = new TextBlock(); ;
- var binding = new Binding
- {
- Path = "Foo",
- };
-
- var result = binding.Initiate(target, TextBox.TextProperty).Subject;
-
- Assert.IsType(((BindingExpression)result).Converter);
- }
-
- [Fact]
- public void Should_Use_Supplied_Converter()
- {
- var target = new TextBlock();
- var converter = new Mock();
- var binding = new Binding
- {
- Converter = converter.Object,
- Path = "Foo",
- };
-
- var result = binding.Initiate(target, TextBox.TextProperty).Subject;
-
- Assert.Same(converter.Object, ((BindingExpression)result).Converter);
- }
-
- [Fact]
- public void Should_Pass_ConverterParameter_To_Supplied_Converter()
- {
- var target = new TextBlock();
- var converter = new Mock();
- var binding = new Binding
- {
- Converter = converter.Object,
- ConverterParameter = "foo",
- Path = "Bar",
- };
-
- var result = binding.Initiate(target, TextBox.TextProperty).Subject;
-
- Assert.Same("foo", ((BindingExpression)result).ConverterParameter);
- }
-
- [Fact]
- public void Should_Return_FallbackValue_When_Path_Not_Resolved()
- {
- var target = new TextBlock();
- var source = new Source();
- var binding = new Binding
- {
- Source = source,
- Path = "BadPath",
- FallbackValue = "foofallback",
- };
-
- target.Bind(TextBlock.TextProperty, binding);
-
- Assert.Equal("foofallback", target.Text);
- }
-
- [Fact]
- public void Should_Return_FallbackValue_When_Invalid_Source_Type()
- {
- var target = new ProgressBar();
- var source = new Source { Foo = "foo" };
- var binding = new Binding
- {
- Source = source,
- Path = "Foo",
- FallbackValue = 42,
- };
-
- target.Bind(ProgressBar.ValueProperty, binding);
-
- Assert.Equal(42, target.Value);
- }
-
- ///
- /// Tests a problem discovered with ListBox with selection.
- ///
- ///
- /// - Items is bound to DataContext first, followed by say SelectedIndex
- /// - When the ListBox is removed from the logical tree, DataContext becomes null (as it's
- /// inherited)
- /// - This changes Items to null, which changes SelectedIndex to null as there are no
- /// longer any items
- /// - However, the news that DataContext is now null hasn't yet reached the SelectedIndex
- /// binding and so the unselection is sent back to the ViewModel
- ///
- [Fact]
- public void Should_Not_Write_To_Old_DataContext()
- {
- var vm = new OldDataContextViewModel();
- var target = new OldDataContextTest();
-
- var fooBinding = new Binding
- {
- Path = "Foo",
- Mode = BindingMode.TwoWay,
- };
-
- var barBinding = new Binding
- {
- Path = "Bar",
- Mode = BindingMode.TwoWay,
- };
-
- // Bind Foo and Bar to the VM.
- target.Bind(OldDataContextTest.FooProperty, fooBinding);
- target.Bind(OldDataContextTest.BarProperty, barBinding);
- target.DataContext = vm;
-
- // Make sure the control's Foo and Bar properties are read from the VM
- Assert.Equal(1, target.GetValue(OldDataContextTest.FooProperty));
- Assert.Equal(2, target.GetValue(OldDataContextTest.BarProperty));
-
- // Set DataContext to null.
- target.DataContext = null;
-
- // Foo and Bar are no longer bound so they return 0, their default value.
- Assert.Equal(0, target.GetValue(OldDataContextTest.FooProperty));
- Assert.Equal(0, target.GetValue(OldDataContextTest.BarProperty));
-
- // The problem was here - DataContext is now null, setting Foo to 0. Bar is bound to
- // Foo so Bar also gets set to 0. However the Bar binding still had a reference to
- // the VM and so vm.Bar was set to 0 erroneously.
- Assert.Equal(1, vm.Foo);
- Assert.Equal(2, vm.Bar);
- }
-
- [Fact]
- public void AvaloniaObject_this_Operator_Accepts_Binding()
- {
- var target = new ContentControl
- {
- DataContext = new { Foo = "foo" }
- };
-
- target[!ContentControl.ContentProperty] = new Binding("Foo");
-
- Assert.Equal("foo", target.Content);
- }
-
- [Fact]
- public void StyledProperty_SetValue_Should_Not_Cause_StackOverflow_And_Have_Correct_Values()
- {
- var viewModel = new TestStackOverflowViewModel()
- {
- Value = 50
- };
-
- var target = new StyledPropertyClass();
-
- target.Bind(StyledPropertyClass.DoubleValueProperty,
- new Binding("Value") { Mode = BindingMode.TwoWay, Source = viewModel });
-
- var child = new StyledPropertyClass();
-
- child.Bind(StyledPropertyClass.DoubleValueProperty,
- new Binding("DoubleValue")
- {
- Mode = BindingMode.TwoWay,
- Source = target
- });
-
- Assert.Equal(1, viewModel.SetterInvokedCount);
-
- //here in real life stack overflow exception is thrown issue #855 and #824
- target.DoubleValue = 51.001;
-
- Assert.Equal(2, viewModel.SetterInvokedCount);
-
- double expected = 51;
-
- Assert.Equal(expected, viewModel.Value);
- Assert.Equal(expected, target.DoubleValue);
- Assert.Equal(expected, child.DoubleValue);
- }
-
- [Fact]
- public void SetValue_Should_Not_Cause_StackOverflow_And_Have_Correct_Values()
- {
- var viewModel = new TestStackOverflowViewModel()
- {
- Value = 50
- };
-
- var target = new DirectPropertyClass();
-
- target.Bind(DirectPropertyClass.DoubleValueProperty, new Binding("Value")
- {
- Mode = BindingMode.TwoWay,
- Source = viewModel
- });
-
- var child = new DirectPropertyClass();
-
- child.Bind(DirectPropertyClass.DoubleValueProperty,
- new Binding("DoubleValue")
- {
- Mode = BindingMode.TwoWay,
- Source = target
- });
-
- Assert.Equal(1, viewModel.SetterInvokedCount);
-
- //here in real life stack overflow exception is thrown issue #855 and #824
- target.DoubleValue = 51.001;
-
- Assert.Equal(2, viewModel.SetterInvokedCount);
-
- double expected = 51;
-
- Assert.Equal(expected, viewModel.Value);
- Assert.Equal(expected, target.DoubleValue);
- Assert.Equal(expected, child.DoubleValue);
- }
-
- private class StyledPropertyClass : AvaloniaObject
- {
- public static readonly StyledProperty DoubleValueProperty =
- AvaloniaProperty.Register(nameof(DoubleValue));
-
- public double DoubleValue
- {
- get { return GetValue(DoubleValueProperty); }
- set { SetValue(DoubleValueProperty, value); }
- }
- }
-
- private class DirectPropertyClass : AvaloniaObject
- {
- public static readonly DirectProperty DoubleValueProperty =
- AvaloniaProperty.RegisterDirect(
- nameof(DoubleValue),
- o => o.DoubleValue,
- (o, v) => o.DoubleValue = v);
-
- private double _doubleValue;
- public double DoubleValue
- {
- get { return _doubleValue; }
- set { SetAndRaise(DoubleValueProperty, ref _doubleValue, value); }
- }
- }
-
- private class TestStackOverflowViewModel : INotifyPropertyChanged
- {
- public int SetterInvokedCount { get; private set; }
-
- public const int MaxInvokedCount = 1000;
-
- private double _value;
-
- public event PropertyChangedEventHandler PropertyChanged;
-
- public double Value
- {
- get { return _value; }
- set
- {
- if (_value != value)
- {
- SetterInvokedCount++;
- if (SetterInvokedCount < MaxInvokedCount)
- {
- _value = (int)value;
- if (_value > 75) _value = 75;
- if (_value < 25) _value = 25;
- }
- else
- {
- _value = value;
- }
-
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Value)));
- }
- }
- }
- }
-
-
[Fact]
public void Binding_With_Null_Path_Works()
{
@@ -484,8 +27,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data
{
var xaml = @"
+ xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
";
var loader = new AvaloniaXamlLoader();
@@ -498,73 +40,5 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data
Assert.Equal("foo", textBlock.Text);
}
}
-
- private class TwoWayBindingTest : Control
- {
- public static readonly StyledProperty TwoWayProperty =
- AvaloniaProperty.Register(
- "TwoWay",
- defaultBindingMode: BindingMode.TwoWay);
-
- public string TwoWay
- {
- get { return GetValue(TwoWayProperty); }
- set { SetValue(TwoWayProperty, value); }
- }
- }
-
- public class Source : INotifyPropertyChanged
- {
- private string _foo;
-
- public string Foo
- {
- get { return _foo; }
- set
- {
- _foo = value;
- RaisePropertyChanged();
- }
- }
-
- public event PropertyChangedEventHandler PropertyChanged;
-
- private void RaisePropertyChanged([CallerMemberName] string prop = "")
- {
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
- }
- }
-
- private class OldDataContextViewModel
- {
- public int Foo { get; set; } = 1;
- public int Bar { get; set; } = 2;
- }
-
- private class OldDataContextTest : Control
- {
- public static readonly StyledProperty FooProperty =
- AvaloniaProperty.Register("Foo");
-
- public static readonly StyledProperty BarProperty =
- AvaloniaProperty.Register("Bar");
-
- public OldDataContextTest()
- {
- Bind(BarProperty, this.GetObservable(FooProperty));
- }
- }
-
- private class InheritanceTest : Decorator
- {
- public static readonly StyledProperty BazProperty =
- AvaloniaProperty.Register(nameof(Baz), defaultValue: 6, inherits: true);
-
- public int Baz
- {
- get { return GetValue(BazProperty); }
- set { SetValue(BazProperty, value); }
- }
- }
}
}
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_TemplatedParent.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_TemplatedParent.cs
index ccb13039f1..ab5b7e76a4 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_TemplatedParent.cs
+++ b/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_TemplatedParent.cs
@@ -7,7 +7,6 @@ using System.Reactive.Subjects;
using Moq;
using Avalonia.Controls;
using Avalonia.Data;
-using Avalonia.Markup.Xaml.Data;
using Avalonia.Styling;
using Xunit;
using System.Reactive.Disposables;
@@ -19,46 +18,6 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data
{
public class BindingTests_TemplatedParent
{
- [Fact]
- public void OneWay_Binding_Should_Be_Set_Up()
- {
- var target = CreateTarget();
- var binding = new Binding
- {
- Mode = BindingMode.OneWay,
- RelativeSource = new RelativeSource(RelativeSourceMode.TemplatedParent),
- Priority = BindingPriority.TemplatedParent,
- Path = "Foo",
- };
-
- target.Object.Bind(TextBox.TextProperty, binding);
-
- target.Verify(x => x.Bind(
- TextBox.TextProperty,
- It.IsAny>(),
- BindingPriority.TemplatedParent));
- }
-
- [Fact]
- public void TwoWay_Binding_Should_Be_Set_Up()
- {
- var target = CreateTarget();
- var binding = new Binding
- {
- Mode = BindingMode.TwoWay,
- RelativeSource = new RelativeSource(RelativeSourceMode.TemplatedParent),
- Priority = BindingPriority.TemplatedParent,
- Path = "Foo",
- };
-
- target.Object.Bind(TextBox.TextProperty, binding);
-
- target.Verify(x => x.Bind(
- TextBox.TextProperty,
- It.IsAny>(),
- BindingPriority.TemplatedParent));
- }
-
[Fact]
public void TemplateBinding_With_Null_Path_Works()
{
@@ -87,19 +46,5 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data
Assert.Equal("Avalonia.Controls.Button", textBlock.Text);
}
}
-
- private Mock CreateTarget(
- ITemplatedControl templatedParent = null,
- string text = null)
- {
- var result = new Mock();
-
- result.Setup(x => x.GetValue(Control.TemplatedParentProperty)).Returns(templatedParent);
- result.Setup(x => x.GetValue((AvaloniaProperty)Control.TemplatedParentProperty)).Returns(templatedParent);
- result.Setup(x => x.GetValue((AvaloniaProperty)TextBox.TextProperty)).Returns(text);
- result.Setup(x => x.Bind(It.IsAny(), It.IsAny>(), It.IsAny()))
- .Returns(Disposable.Empty);
- return result;
- }
}
}
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs
index d55e34cbe6..8f2cba06a3 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs
+++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs
@@ -6,7 +6,7 @@ using System.Linq;
using Avalonia.Controls;
using Avalonia.Controls.Presenters;
using Avalonia.Controls.Templates;
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Markup.Data;
using Avalonia.Media;
using Avalonia.Styling;
using Avalonia.UnitTests;
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Data/ResourceIncludeTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/ResourceIncludeTests.cs
similarity index 96%
rename from tests/Avalonia.Markup.Xaml.UnitTests/Data/ResourceIncludeTests.cs
rename to tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/ResourceIncludeTests.cs
index 6dc56e425c..a35c7bdd9b 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/Data/ResourceIncludeTests.cs
+++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/ResourceIncludeTests.cs
@@ -4,7 +4,7 @@ using Avalonia.Media;
using Avalonia.UnitTests;
using Xunit;
-namespace Avalonia.Markup.Xaml.UnitTests.Data
+namespace Avalonia.Markup.Xaml.UnitTests.MakrupExtensions
{
public class ResourceIncludeTests
{
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/TestValueConverter.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/TestValueConverter.cs
index 57570d8f5c..cafad1056f 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/TestValueConverter.cs
+++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/TestValueConverter.cs
@@ -1,5 +1,6 @@
using System;
using System.Globalization;
+using Avalonia.Data.Converters;
namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions
{
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/StyleTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/StyleTests.cs
index e8e1646d44..91da8e18a1 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/StyleTests.cs
+++ b/tests/Avalonia.Markup.Xaml.UnitTests/StyleTests.cs
@@ -5,7 +5,7 @@ using System.Linq;
using System.Reactive.Linq;
using Avalonia.Controls;
using Avalonia.Data;
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Markup.Data;
using Avalonia.Styling;
using Avalonia.UnitTests;
using Xunit;
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs
index 0fcb9432ab..c41cf4a590 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs
+++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs
@@ -4,7 +4,9 @@
using Avalonia.Collections;
using Avalonia.Controls;
using Avalonia.Controls.Presenters;
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Data;
+using Avalonia.Data.Converters;
+using Avalonia.Markup.Data;
using Avalonia.Markup.Xaml.Styling;
using Avalonia.Markup.Xaml.Templates;
using Avalonia.Media;
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs
index f1f4792d34..2c7e850fee 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs
+++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs
@@ -2,7 +2,7 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using Avalonia.Controls;
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Markup.Data;
using Avalonia.Markup.Xaml.Styling;
using Avalonia.Media;
using Avalonia.Styling;
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/TreeDataTemplateTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/TreeDataTemplateTests.cs
index a7ddfeeb00..4134f5be23 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/TreeDataTemplateTests.cs
+++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/TreeDataTemplateTests.cs
@@ -3,7 +3,8 @@
using System.Linq;
using Avalonia.Controls.Templates;
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Data;
+using Avalonia.Markup.Data;
using Avalonia.Markup.Xaml.Templates;
using Avalonia.UnitTests;
using Xunit;
diff --git a/tests/Avalonia.Markup.UnitTests/ControlLocatorTests.cs b/tests/Avalonia.Styling.UnitTests/ControlLocatorTests.cs
similarity index 95%
rename from tests/Avalonia.Markup.UnitTests/ControlLocatorTests.cs
rename to tests/Avalonia.Styling.UnitTests/ControlLocatorTests.cs
index b3e983036d..519a456ee2 100644
--- a/tests/Avalonia.Markup.UnitTests/ControlLocatorTests.cs
+++ b/tests/Avalonia.Styling.UnitTests/ControlLocatorTests.cs
@@ -6,10 +6,11 @@ using System.Collections.Generic;
using System.Reactive.Linq;
using System.Threading.Tasks;
using Avalonia.Controls;
+using Avalonia.LogicalTree;
using Avalonia.UnitTests;
using Xunit;
-namespace Avalonia.Markup.UnitTests
+namespace Avalonia.Styling.UnitTests
{
public class ControlLocatorTests
{
@@ -61,7 +62,7 @@ namespace Avalonia.Markup.UnitTests
var locator = ControlLocator.Track(relativeTo, "target");
var target = new TextBlock { Name = "target" };
- var result = new List();
+ var result = new List();
using (locator.Subscribe(x => result.Add(x)))
{
@@ -93,7 +94,7 @@ namespace Avalonia.Markup.UnitTests
};
var locator = ControlLocator.Track(relativeTo, "target");
- var result = new List();
+ var result = new List();
locator.Subscribe(x => result.Add(x));
var other = new TextBlock { Name = "target" };
@@ -138,7 +139,7 @@ namespace Avalonia.Markup.UnitTests
var locator = ControlLocator.Track(relativeTo, "target");
var target = new TextBlock { Name = "target" };
- var result = new List();
+ var result = new List();
using (locator.Subscribe(x => result.Add(x)))
{
diff --git a/tests/Avalonia.Styling.UnitTests/SetterTests.cs b/tests/Avalonia.Styling.UnitTests/SetterTests.cs
index f376df4d0b..7c1623cf21 100644
--- a/tests/Avalonia.Styling.UnitTests/SetterTests.cs
+++ b/tests/Avalonia.Styling.UnitTests/SetterTests.cs
@@ -8,9 +8,10 @@ using Avalonia.Data;
using Xunit;
using System;
using Avalonia.Controls.Templates;
-using Avalonia.Markup.Xaml.Data;
+using Avalonia.Markup.Data;
using Avalonia.Markup;
using System.Globalization;
+using Avalonia.Data.Converters;
namespace Avalonia.Styling.UnitTests
{
diff --git a/tests/Avalonia.Controls.UnitTests/ControlTests.cs b/tests/Avalonia.Styling.UnitTests/StyledElementTests.cs
similarity index 97%
rename from tests/Avalonia.Controls.UnitTests/ControlTests.cs
rename to tests/Avalonia.Styling.UnitTests/StyledElementTests.cs
index 313c0b1253..4096dcf380 100644
--- a/tests/Avalonia.Controls.UnitTests/ControlTests.cs
+++ b/tests/Avalonia.Styling.UnitTests/StyledElementTests.cs
@@ -9,15 +9,16 @@ using Avalonia.Styling;
using Avalonia.UnitTests;
using Xunit;
using Avalonia.LogicalTree;
+using Avalonia.Controls;
-namespace Avalonia.Controls.UnitTests
+namespace Avalonia.Styling.UnitTests
{
- public class ControlTests
+ public class StyledElementTests
{
[Fact]
public void Classes_Should_Initially_Be_Empty()
{
- var target = new Control();
+ var target = new StyledElement();
Assert.Empty(target.Classes);
}
@@ -116,7 +117,7 @@ namespace Avalonia.Controls.UnitTests
raised.Add("attached");
};
- child.GetObservable(Control.ParentProperty).Skip(1).Subscribe(_ => raised.Add("parent"));
+ child.GetObservable(StyledElement.ParentProperty).Skip(1).Subscribe(_ => raised.Add("parent"));
root.Child = child;
@@ -354,7 +355,7 @@ namespace Avalonia.Controls.UnitTests
};
var called = new List();
- void Record(object sender, EventArgs e) => called.Add(((Control)sender).Name);
+ void Record(object sender, EventArgs e) => called.Add(((StyledElement)sender).Name);
root.DataContextChanged += Record;
@@ -396,9 +397,9 @@ namespace Avalonia.Controls.UnitTests
foreach (IDataContextEvents c in root.GetSelfAndLogicalDescendants())
{
- c.DataContextBeginUpdate += (s, e) => called.Add("begin " + ((Control)s).Name);
- c.DataContextChanged += (s, e) => called.Add("changed " + ((Control)s).Name);
- c.DataContextEndUpdate += (s, e) => called.Add("end " + ((Control)s).Name);
+ c.DataContextBeginUpdate += (s, e) => called.Add("begin " + ((StyledElement)s).Name);
+ c.DataContextChanged += (s, e) => called.Add("changed " + ((StyledElement)s).Name);
+ c.DataContextEndUpdate += (s, e) => called.Add("end " + ((StyledElement)s).Name);
}
root.DataContext = "foo";
diff --git a/tests/Avalonia.Controls.UnitTests/ControlTests_NameScope.cs b/tests/Avalonia.Styling.UnitTests/StyledElementTests_NameScope.cs
similarity index 94%
rename from tests/Avalonia.Controls.UnitTests/ControlTests_NameScope.cs
rename to tests/Avalonia.Styling.UnitTests/StyledElementTests_NameScope.cs
index 9f39f7a47a..47c540f44a 100644
--- a/tests/Avalonia.Controls.UnitTests/ControlTests_NameScope.cs
+++ b/tests/Avalonia.Styling.UnitTests/StyledElementTests_NameScope.cs
@@ -11,7 +11,7 @@ using Xunit;
namespace Avalonia.Controls.UnitTests
{
- public class ControlTests_NameScope
+ public class StyledElementTests_NameScope
{
[Fact]
public void Controls_Should_Register_With_NameScope()
@@ -68,7 +68,7 @@ namespace Avalonia.Controls.UnitTests
root.ApplyTemplate();
- Assert.Null(NameScope.GetNameScope((Control)root.Presenter).Find("foo"));
+ Assert.Null(NameScope.GetNameScope((StyledElement)root.Presenter).Find("foo"));
}
[Fact]
diff --git a/tests/Avalonia.Controls.UnitTests/ControlTests_Resources.cs b/tests/Avalonia.Styling.UnitTests/StyledElementTests_Resources.cs
similarity index 95%
rename from tests/Avalonia.Controls.UnitTests/ControlTests_Resources.cs
rename to tests/Avalonia.Styling.UnitTests/StyledElementTests_Resources.cs
index 9ee6e3e456..c321adb394 100644
--- a/tests/Avalonia.Controls.UnitTests/ControlTests_Resources.cs
+++ b/tests/Avalonia.Styling.UnitTests/StyledElementTests_Resources.cs
@@ -10,12 +10,12 @@ using Xunit;
namespace Avalonia.Controls.UnitTests
{
- public class ControlTests_Resources
+ public class StyledElementTests_Resources
{
[Fact]
public void FindResource_Should_Find_Control_Resource()
{
- var target = new Control
+ var target = new StyledElement
{
Resources =
{
@@ -68,7 +68,7 @@ namespace Avalonia.Controls.UnitTests
[Fact]
public void FindResource_Should_Find_Style_Resource()
{
- var target = new Control
+ var target = new StyledElement
{
Styles =
{
@@ -92,7 +92,7 @@ namespace Avalonia.Controls.UnitTests
[Fact]
public void FindResource_Should_Find_Styles_Resource()
{
- var target = new Control
+ var target = new StyledElement
{
Styles =
{
@@ -188,7 +188,7 @@ namespace Avalonia.Controls.UnitTests
public void Adding_Resource_To_Nested_Style_Should_Raise_ResourceChanged()
{
Style style;
- var target = new Decorator
+ var target = new StyledElement
{
Styles =
{
@@ -208,7 +208,7 @@ namespace Avalonia.Controls.UnitTests
public void Setting_Logical_Parent_Subscribes_To_Parents_ResourceChanged_Event()
{
var parent = new ContentControl();
- var child = new Border();
+ var child = new StyledElement();
((ISetLogicalParent)child).SetParent(parent);
var raisedOnChild = false;