Explorar o código

Revert "Upgrade ReactiveUI to the v8 alpha"

Jeremy Koritzinsky %!s(int64=8) %!d(string=hai) anos
pai
achega
5ec7b33a1a

+ 3 - 0
.gitmodules

@@ -1,3 +1,6 @@
+[submodule "src/Avalonia.ReactiveUI/src"]
+	path = src/Avalonia.ReactiveUI/src
+	url = https://github.com/reactiveui/ReactiveUI.git
 [submodule "src/Avalonia.HtmlRenderer/external"]
 	path = src/Avalonia.HtmlRenderer/external
 	url = https://github.com/AvaloniaUI/HTML-Renderer.git

+ 1 - 2
Avalonia.sln

@@ -1,6 +1,6 @@
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 15
-VisualStudioVersion = 15.0.26430.16
+VisualStudioVersion = 15.0.26228.4
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Base", "src\Avalonia.Base\Avalonia.Base.csproj", "{B09B78D8-9B26-48B0-9149-D64A2F120F3F}"
 EndProject
@@ -169,7 +169,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Props", "Props", "{F3AC8BC1
 		build\Microsoft.Reactive.Testing.props = build\Microsoft.Reactive.Testing.props
 		build\Moq.props = build\Moq.props
 		build\NetCore.props = build\NetCore.props
-		build\ReactiveUI.props = build\ReactiveUI.props
 		build\Rx.props = build\Rx.props
 		build\Serilog.props = build\Serilog.props
 		build\Serilog.Sinks.Trace.props = build\Serilog.Sinks.Trace.props

+ 0 - 5
build/ReactiveUI.props

@@ -1,5 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <PackageReference Include="reactiveui" Version="8.0.0-alpha0034" />
-  </ItemGroup>
-</Project>

+ 7 - 6
build/Rx.props

@@ -1,10 +1,11 @@
 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
-    <PackageReference Include="System.Reactive" Version="3.1.0" />
-    <PackageReference Include="System.Reactive.Core" Version="3.1.0" />
-    <PackageReference Include="System.Reactive.Interfaces" Version="3.1.0" />
-    <PackageReference Include="System.Reactive.Linq" Version="3.1.0" />
-    <PackageReference Include="System.Reactive.PlatformServices" Version="3.1.0" />
-    <PackageReference Condition="$(TargetFramework.StartsWith('net4'))" Include="System.Reactive.Windows.Threading" Version="3.1.0" />
+    <PackageReference Include="System.Reactive" Version="3.0.0" />
+    <PackageReference Include="System.Reactive.Core" Version="3.0.0" />
+    <PackageReference Include="System.Reactive.Interfaces" Version="3.0.0" />
+    <PackageReference Include="System.Reactive.Linq" Version="3.0.0" />
+    <PackageReference Include="System.Reactive.PlatformServices" Version="3.0.0" />
+    <PackageReference Condition="'$(TargetFramework)' == 'net45'" Include="System.Reactive.Windows.Threading" Version="3.0.0" />
+    <PackageReference Condition="'$(TargetFramework)' == 'net461'" Include="System.Reactive.Windows.Threading" Version="3.0.0" />
   </ItemGroup>
 </Project>

+ 2 - 20
packages.cake

@@ -111,7 +111,6 @@ public class Packages
         var SplatVersion = packageVersions["Splat"].FirstOrDefault().Item1;
         var SpracheVersion = packageVersions["Sprache"].FirstOrDefault().Item1;
         var SystemReactiveVersion = packageVersions["System.Reactive"].FirstOrDefault().Item1;
-        var ReactiveUIVersion = packageVersions["reactiveui"].FirstOrDefault().Item1;
         var SystemValueTupleVersion = packageVersions["System.ValueTuple"].FirstOrDefault().Item1;
         SkiaSharpVersion = packageVersions["SkiaSharp"].FirstOrDefault().Item1;
 		SkiaSharpLinuxVersion = packageVersions["Avalonia.Skia.Linux.Natives"].FirstOrDefault().Item1;
@@ -125,7 +124,6 @@ public class Packages
         context.Information("Package: Splat, version: {0}", SplatVersion);
         context.Information("Package: Sprache, version: {0}", SpracheVersion);
         context.Information("Package: System.Reactive, version: {0}", SystemReactiveVersion);
-        context.Information("Package: reactiveui, version: {0}", ReactiveUIVersion);
         context.Information("Package: System.ValueTuple, version: {0}", SystemValueTupleVersion);
         context.Information("Package: SkiaSharp, version: {0}", SkiaSharpVersion);
         context.Information("Package: Avalonia.Skia.Linux.Natives, version: {0}", SkiaSharpLinuxVersion);
@@ -178,6 +176,7 @@ public class Packages
             new [] { "./src/", "Avalonia.Visuals", ".xml" },
             new [] { "./src/", "Avalonia.Styling", ".dll" },
             new [] { "./src/", "Avalonia.Styling", ".xml" },
+            new [] { "./src/", "Avalonia.ReactiveUI", ".dll" },
             new [] { "./src/", "Avalonia.Themes.Default", ".dll" },
             new [] { "./src/", "Avalonia.Themes.Default", ".xml" },
             new [] { "./src/Markup/", "Avalonia.Markup", ".dll" },
@@ -274,24 +273,7 @@ public class Packages
                 },
                 BasePath = context.Directory("./src/Avalonia.HtmlRenderer/bin/" + parameters.DirSuffix + "/netstandard1.3"),
                 OutputDirectory = parameters.NugetRoot
-            },
-            ///////////////////////////////////////////////////////////////////////////////
-            // Avalonia.ReactiveUI
-            ///////////////////////////////////////////////////////////////////////////////
-            new NuGetPackSettings()
-            {
-                Id = "Avalonia.ReactiveUI",
-                Dependencies = new DependencyBuilder(this)
-                {
-                    new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version },
-                }.Deps(new string[] {null}, "reactiveui"),
-                Files = new []
-                {
-                    new NuSpecContent { Source = "Avalonia.ReactiveUI.dll", Target = "lib/netstandard1.3" }
-                },
-                BasePath = context.Directory("./src/Avalonia.ReactiveUI/bin/" + parameters.DirSuffix + "/netstandard1.3"),
-                OutputDirectory = parameters.NugetRoot
-            },
+            }
         };
 
         var nuspecNuGetSettingsMobile = new []

+ 0 - 1
samples/BindingTest/App.xaml.cs

@@ -20,7 +20,6 @@ namespace BindingTest
 
             AppBuilder.Configure<App>()
                 .UsePlatformDetect()
-                .UseReactiveUI()
                 .Start<MainWindow>();
         }
 

+ 1 - 1
samples/BindingTest/BindingTest.csproj

@@ -45,6 +45,7 @@
     <Reference Include="System.Data.DataSetExtensions" />
     <Reference Include="Microsoft.CSharp" />
     <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
@@ -161,5 +162,4 @@
   <Import Project="..\..\build\Serilog.Sinks.Trace.props" />
   <Import Project="..\..\build\Splat.props" />
   <Import Project="..\..\build\Rx.props" />
-  <Import Project="..\..\build\ReactiveUI.props" />
 </Project>

+ 6 - 4
samples/BindingTest/ViewModels/MainWindowViewModel.cs

@@ -27,13 +27,15 @@ namespace BindingTest.ViewModels
 
             SelectedItems = new ObservableCollection<TestItem>();
 
-            ShuffleItems = ReactiveCommand.Create(() =>
+            ShuffleItems = ReactiveCommand.Create();
+            ShuffleItems.Subscribe(_ =>
             {
                 var r = new Random();
                 Items.Move(r.Next(Items.Count), 1);
             });
 
-            StringValueCommand = ReactiveCommand.Create<object>(param =>
+            StringValueCommand = ReactiveCommand.Create();
+            StringValueCommand.Subscribe(param =>
             {
                 BooleanFlag = !BooleanFlag;
                 StringValue = param.ToString();
@@ -54,7 +56,7 @@ namespace BindingTest.ViewModels
 
         public ObservableCollection<TestItem> Items { get; }
         public ObservableCollection<TestItem> SelectedItems { get; }
-        public ReactiveCommand ShuffleItems { get; }
+        public ReactiveCommand<object> ShuffleItems { get; }
 
         public string BooleanString
         {
@@ -87,7 +89,7 @@ namespace BindingTest.ViewModels
         }
 
         public IObservable<string> CurrentTimeObservable { get; }
-        public ReactiveCommand StringValueCommand { get; }
+        public ReactiveCommand<object> StringValueCommand { get; }
 
         public DataAnnotationsErrorViewModel DataAnnotationsValidation { get; } = new DataAnnotationsErrorViewModel();
         public ExceptionErrorViewModel ExceptionDataValidation { get; } = new ExceptionErrorViewModel();

+ 0 - 1
samples/RenderTest/Program.cs

@@ -18,7 +18,6 @@ namespace RenderTest
             // again.
             AppBuilder.Configure<App>()
                 .UsePlatformDetect()
-                .UseReactiveUI()
                 .Start<MainWindow>();
         }
 

+ 0 - 1
samples/RenderTest/RenderTest.csproj

@@ -183,5 +183,4 @@
   <Import Project="..\..\build\Serilog.Sinks.Trace.props" />
   <Import Project="..\..\build\Splat.props" />
   <Import Project="..\..\build\Rx.props" />
-  <Import Project="..\..\build\ReactiveUI.props" />
 </Project>

+ 6 - 4
samples/RenderTest/ViewModels/MainWindowViewModel.cs

@@ -10,8 +10,10 @@ namespace RenderTest.ViewModels
 
         public MainWindowViewModel()
         {
-            ToggleDrawDirtyRects = ReactiveCommand.Create(() => DrawDirtyRects = !DrawDirtyRects);
-            ToggleDrawFps = ReactiveCommand.Create(() => DrawFps = !DrawFps);
+            ToggleDrawDirtyRects = ReactiveCommand.Create();
+            ToggleDrawDirtyRects.Subscribe(_ => DrawDirtyRects = !DrawDirtyRects);
+            ToggleDrawFps = ReactiveCommand.Create();
+            ToggleDrawFps.Subscribe(_ => DrawFps = !DrawFps);
         }
 
         public bool DrawDirtyRects
@@ -26,7 +28,7 @@ namespace RenderTest.ViewModels
             set { this.RaiseAndSetIfChanged(ref drawFps, value); }
         }
 
-        public ReactiveCommand ToggleDrawDirtyRects { get; }
-        public ReactiveCommand ToggleDrawFps { get; }
+        public ReactiveCommand<object> ToggleDrawDirtyRects { get; }
+        public ReactiveCommand<object> ToggleDrawFps { get; }
     }
 }

+ 0 - 1
samples/VirtualizationTest/Program.cs

@@ -17,7 +17,6 @@ namespace VirtualizationTest
 
             AppBuilder.Configure<App>()
                .UsePlatformDetect()
-               .UseReactiveUI()
                .Start<MainWindow>();
         }
 

+ 15 - 10
samples/VirtualizationTest/ViewModels/MainWindowViewModel.cs

@@ -23,15 +23,20 @@ namespace VirtualizationTest.ViewModels
         public MainWindowViewModel()
         {
             this.WhenAnyValue(x => x.ItemCount).Subscribe(ResizeItems);
-            RecreateCommand = ReactiveCommand.Create(() => Recreate());
+            RecreateCommand = ReactiveCommand.Create();
+            RecreateCommand.Subscribe(_ => Recreate());
 
-            AddItemCommand = ReactiveCommand.Create(() => AddItem());
+            AddItemCommand = ReactiveCommand.Create();
+            AddItemCommand.Subscribe(_ => AddItem());
 
-            RemoveItemCommand = ReactiveCommand.Create(() => Remove());
+            RemoveItemCommand = ReactiveCommand.Create();
+            RemoveItemCommand.Subscribe(_ => Remove());
 
-            SelectFirstCommand = ReactiveCommand.Create(() => SelectItem(0));
+            SelectFirstCommand = ReactiveCommand.Create();
+            SelectFirstCommand.Subscribe(_ => SelectItem(0));
 
-            SelectLastCommand = ReactiveCommand.Create(() => SelectItem(Items.Count - 1));
+            SelectLastCommand = ReactiveCommand.Create();
+            SelectLastCommand.Subscribe(_ => SelectItem(Items.Count - 1));
         }
 
         public string NewItemString
@@ -73,11 +78,11 @@ namespace VirtualizationTest.ViewModels
         public IEnumerable<ItemVirtualizationMode> VirtualizationModes => 
             Enum.GetValues(typeof(ItemVirtualizationMode)).Cast<ItemVirtualizationMode>();
 
-        public ReactiveCommand AddItemCommand { get; private set; }
-        public ReactiveCommand RecreateCommand { get; private set; }
-        public ReactiveCommand RemoveItemCommand { get; private set; }
-        public ReactiveCommand SelectFirstCommand { get; private set; }
-        public ReactiveCommand SelectLastCommand { get; private set; }
+        public ReactiveCommand<object> AddItemCommand { get; private set; }
+        public ReactiveCommand<object> RecreateCommand { get; private set; }
+        public ReactiveCommand<object> RemoveItemCommand { get; private set; }
+        public ReactiveCommand<object> SelectFirstCommand { get; private set; }
+        public ReactiveCommand<object> SelectLastCommand { get; private set; }
 
         private void ResizeItems(int count)
         {

+ 0 - 1
samples/VirtualizationTest/VirtualizationTest.csproj

@@ -158,5 +158,4 @@
   <Import Project="..\..\build\Serilog.Sinks.Trace.props" />
   <Import Project="..\..\build\Splat.props" />
   <Import Project="..\..\build\Rx.props" />
-  <Import Project="..\..\build\ReactiveUI.props" />
 </Project>

+ 0 - 24
src/Avalonia.ReactiveUI/AppBuilderExtensions.cs

@@ -1,24 +0,0 @@
-// 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.Controls;
-using Avalonia.Threading;
-using ReactiveUI;
-using System;
-using System.Reactive.Concurrency;
-using System.Threading;
-
-namespace Avalonia
-{
-    public static class AppBuilderExtensions
-    {
-        public static TAppBuilder UseReactiveUI<TAppBuilder>(this TAppBuilder builder)
-            where TAppBuilder : AppBuilderBase<TAppBuilder>, new()
-        {
-            return builder.AfterSetup(_ =>
-            {
-                RxApp.MainThreadScheduler = AvaloniaScheduler.Instance;
-            });
-        }
-    }
-}

+ 71 - 2
src/Avalonia.ReactiveUI/Avalonia.ReactiveUI.csproj

@@ -1,10 +1,80 @@
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
     <TargetFramework>netstandard1.3</TargetFramework>
+    <EnableDefaultCompileItems>False</EnableDefaultCompileItems>
     <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
   </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;MONO PORTABLE;NETSTANDARD1_1</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE;MONO PORTABLE;RELEASE;NETSTANDARD1_1</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <None Remove="Shims.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
   <ItemGroup>
-    <Compile Include="..\Shared\SharedAssemblyInfo.cs" Link="Properties\SharedAssemblyInfo.cs" />
+    <Compile Include="Registrations.cs" />
+    <Compile Include="Shims.cs" />
+    <Compile Include="src\ReactiveUI\ExpressionMixins.cs" />
+    <Compile Include="src\ReactiveUI\ExpressionRewriter.cs" />
+    <Compile Include="src\ReactiveUI\Activation.cs" />
+    <Compile Include="src\ReactiveUI\ReactiveBinding.cs" />
+    <Compile Include="src\ReactiveUI\AutoPersistHelper.cs" />
+    <Compile Include="src\ReactiveUI\BindingTypeConverters.cs" />
+    <Compile Include="src\ReactiveUI\CollectionDebugView.cs" />
+    <Compile Include="src\ReactiveUI\CommandBinding.cs" />
+    <Compile Include="src\ReactiveUI\CompatMixins.cs" />
+    <Compile Include="src\ReactiveUI\ContractStubs.cs" />
+    <Compile Include="src\ReactiveUI\CreatesCommandBinding.cs" />
+    <Compile Include="src\ReactiveUI\DefaultPropertyBinding.cs" />
+    <Compile Include="src\ReactiveUI\Errors.cs" />
+    <Compile Include="src\ReactiveUI\IDependencyResolver.cs" />
+    <Compile Include="src\ReactiveUI\INPCObservableForProperty.cs" />
+    <Compile Include="src\ReactiveUI\Interfaces.cs" />
+    <Compile Include="src\ReactiveUI\IROObservableForProperty.cs" />
+    <Compile Include="src\ReactiveUI\MessageBus.cs" />
+    <Compile Include="src\ReactiveUI\MobileLifecycle.cs" />
+    <Compile Include="src\ReactiveUI\NullDefaultPropertyBindingProvider.cs" />
+    <Compile Include="src\ReactiveUI\ObservableAsPropertyHelper.cs" />
+    <Compile Include="src\ReactiveUI\ObservedChangedMixin.cs" />
+    <Compile Include="src\ReactiveUI\OrderedComparer.cs" />
+    <Compile Include="src\ReactiveUI\POCOObservableForProperty.cs" />
+    <Compile Include="src\ReactiveUI\PropertyBinding.cs" />
+    <Compile Include="src\ReactiveUI\ReactiveList.cs" />
+    <Compile Include="src\ReactiveUI\ReactiveCollectionMixins.cs" />
+    <Compile Include="src\ReactiveUI\ReactiveCommand.cs" />
+    <Compile Include="src\ReactiveUI\ReactiveNotifyPropertyChangedMixin.cs" />
+    <Compile Include="src\ReactiveUI\ReactiveObject.cs" />
+    <Compile Include="src\ReactiveUI\RefcountDisposeWrapper.cs" />
+    <Compile Include="src\ReactiveUI\Reflection.cs" />
+    <Compile Include="src\ReactiveUI\RegisterableInterfaces.cs" />
+    <Compile Include="src\ReactiveUI\Registrations.cs" />
+    <Compile Include="src\ReactiveUI\RoutableViewModelMixin.cs" />
+    <Compile Include="src\ReactiveUI\RoutingState.cs" />
+    <Compile Include="src\ReactiveUI\RxApp.cs" />
+    <Compile Include="src\ReactiveUI\ViewLocator.cs" />
+    <Compile Include="src\ReactiveUI\ScheduledSubject.cs" />
+    <Compile Include="src\ReactiveUI\VariadicTemplates.cs" />
+    <Compile Include="src\ReactiveUI\WaitForDispatcherScheduler.cs" />
+    <Compile Include="src\ReactiveUI\LoggingMixins.cs" />
+    <Compile Include="src\ReactiveUI\IReactiveObject.cs" />
+    <Compile Include="src\ReactiveUI\WeakEventManager.cs" />
+    <Compile Include="src\ReactiveUI\Legacy\ReactiveCommand.cs" />
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\Avalonia.Animation\Avalonia.Animation.csproj" />
@@ -17,6 +87,5 @@
     <ProjectReference Include="..\Avalonia.Visuals\Avalonia.Visuals.csproj" />
   </ItemGroup>
   <Import Project="..\..\build\Rx.props" />
-  <Import Project="..\..\build\ReactiveUI.props" />
   <Import Project="..\..\build\Splat.props" />
 </Project>

+ 27 - 0
src/Avalonia.ReactiveUI/Properties/AssemblyInfo.cs

@@ -1,6 +1,33 @@
 // 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.Resources;
 using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
 
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
 [assembly: AssemblyTitle("Avalonia.ReactiveUI")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Avalonia.ReactiveUI")]
+[assembly: AssemblyCopyright("Copyright \u00A9  2015")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: NeutralResourcesLanguage("en")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

+ 23 - 0
src/Avalonia.ReactiveUI/Registrations.cs

@@ -0,0 +1,23 @@
+// 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.Concurrency;
+using System.Threading;
+
+
+namespace ReactiveUI
+{
+    /// <summary>
+    /// Ignore me. This class is a secret handshake between RxUI and RxUI.Xaml
+    /// in order to register certain classes on startup that would be difficult
+    /// to register otherwise.
+    /// </summary>
+    public class PlatformRegistrations : IWantsToRegisterStuff
+    {
+        public void Register(Action<Func<object>, Type> registerFunction)
+        {
+            RxApp.MainThreadScheduler = new SynchronizationContextScheduler(SynchronizationContext.Current);
+        }
+    }
+}

+ 34 - 0
src/Avalonia.ReactiveUI/Shims.cs

@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace System.Runtime.Serialization
+{
+    class IgnoreDataMemberAttribute : Attribute
+    {
+    }
+
+    class DataMemberAttribute : Attribute
+    {
+    }
+    class OnDeserializedAttribute : Attribute
+    {
+    }
+
+    class DataContractAttribute : Attribute
+    {
+    }
+
+    class StreamingContext { }
+}
+
+namespace System.Diagnostics.Contracts
+{
+    static class Contract
+    {
+        public static void Requires(bool condition)
+        {
+
+        }
+    }
+}

+ 1 - 0
src/Avalonia.ReactiveUI/src

@@ -0,0 +1 @@
+Subproject commit 3f725c808b1d4c8457f0d3204e0a071aa462cd75

+ 1 - 0
tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj

@@ -19,6 +19,7 @@
     <ProjectReference Include="..\..\src\Avalonia.Input\Avalonia.Input.csproj" />
     <ProjectReference Include="..\..\src\Avalonia.Interactivity\Avalonia.Interactivity.csproj" />
     <ProjectReference Include="..\..\src\Avalonia.Layout\Avalonia.Layout.csproj" />
+    <ProjectReference Include="..\..\src\Avalonia.ReactiveUI\Avalonia.ReactiveUI.csproj" />
     <ProjectReference Include="..\..\src\Avalonia.Visuals\Avalonia.Visuals.csproj" />
     <ProjectReference Include="..\..\src\Avalonia.Styling\Avalonia.Styling.csproj" />
     <ProjectReference Include="..\..\src\Avalonia.Themes.Default\Avalonia.Themes.Default.csproj" />

+ 3 - 15
tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests.cs

@@ -10,9 +10,8 @@ using Avalonia.Data;
 using Avalonia.Markup.Data;
 using Avalonia.Markup.Xaml.Data;
 using Moq;
+using ReactiveUI;
 using Xunit;
-using System.ComponentModel;
-using System.Runtime.CompilerServices;
 
 namespace Avalonia.Markup.Xaml.UnitTests.Data
 {
@@ -351,25 +350,14 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data
             }
         }
 
-        public class Source : INotifyPropertyChanged
+        public class Source : ReactiveObject
         {
             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));
+                set { this.RaiseAndSetIfChanged(ref _foo, value); }
             }
         }
 

+ 4 - 16
tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_Source.cs

@@ -6,9 +6,8 @@ using Avalonia.Controls;
 using Avalonia.Data;
 using Avalonia.Markup.Data;
 using Avalonia.Markup.Xaml.Data;
+using ReactiveUI;
 using Xunit;
-using System.ComponentModel;
-using System.Runtime.CompilerServices;
 
 namespace Avalonia.Markup.Xaml.UnitTests.Data
 {
@@ -25,26 +24,15 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data
 
             Assert.Equal(target.Text, "foo");
         }
-        
-        public class Source : INotifyPropertyChanged
+
+        public class Source : ReactiveObject
         {
             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));
+                set { this.RaiseAndSetIfChanged(ref _foo, value); }
             }
         }
     }