diff --git a/samples/ControlCatalog.Android/ControlCatalog.Android.csproj b/samples/ControlCatalog.Android/ControlCatalog.Android.csproj
index 272632e7eb..d8f0f39977 100644
--- a/samples/ControlCatalog.Android/ControlCatalog.Android.csproj
+++ b/samples/ControlCatalog.Android/ControlCatalog.Android.csproj
@@ -32,7 +32,7 @@
True
False
False
- armeabi;armeabi-v7a;x86
+ armeabi-v7a;x86
Xamarin
False
False
@@ -51,7 +51,7 @@
True
False
False
- armeabi,armeabi-v7a,x86
+ armeabi-v7a,x86
Xamarin
False
False
diff --git a/samples/interop/WindowsInteropTest/Program.cs b/samples/interop/WindowsInteropTest/Program.cs
index fac06d74b0..9f005b942d 100644
--- a/samples/interop/WindowsInteropTest/Program.cs
+++ b/samples/interop/WindowsInteropTest/Program.cs
@@ -15,7 +15,7 @@ namespace WindowsInteropTest
{
System.Windows.Forms.Application.EnableVisualStyles();
System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);
- AppBuilder.Configure().UseWin32().UseDirect2D1().SetupWithoutStarting();
+ AppBuilder.Configure().UseWin32().UseDirect2D1().UseDataGrid().SetupWithoutStarting();
System.Windows.Forms.Application.Run(new SelectorForm());
}
}
diff --git a/samples/interop/WindowsInteropTest/WindowsInteropTest.csproj b/samples/interop/WindowsInteropTest/WindowsInteropTest.csproj
index 33c7b85f06..c067d38595 100644
--- a/samples/interop/WindowsInteropTest/WindowsInteropTest.csproj
+++ b/samples/interop/WindowsInteropTest/WindowsInteropTest.csproj
@@ -104,6 +104,10 @@
{b09b78d8-9b26-48b0-9149-d64a2f120f3f}
Avalonia.Base
+
+ {3278f3a9-9509-4a3f-a15b-bdc8b5bff632}
+ Avalonia.Controls.DataGrid
+
{d2221c82-4a25-4583-9b43-d791e3f6820c}
Avalonia.Controls
@@ -185,6 +189,5 @@
-
\ No newline at end of file
diff --git a/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj b/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj
index b493fd1ef2..c2c0cd4301 100644
--- a/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj
+++ b/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj
@@ -32,7 +32,7 @@
True
False
False
- armeabi;armeabi-v7a;x86
+ armeabi-v7a;x86
Xamarin
False
True
@@ -52,7 +52,7 @@
True
False
False
- armeabi,armeabi-v7a,x86
+ armeabi-v7a,x86
Xamarin
False
False
diff --git a/src/Avalonia.Base/Data/BindingOperations.cs b/src/Avalonia.Base/Data/BindingOperations.cs
index ca148659e6..15de6c4d0d 100644
--- a/src/Avalonia.Base/Data/BindingOperations.cs
+++ b/src/Avalonia.Base/Data/BindingOperations.cs
@@ -65,7 +65,11 @@ namespace Avalonia.Data
return Disposable.Empty;
}
case BindingMode.OneWayToSource:
- return target.GetObservable(property).Subscribe(binding.Subject);
+ return Observable.CombineLatest(
+ binding.Observable,
+ target.GetObservable(property),
+ (_, v) => v)
+ .Subscribe(x => binding.Subject.OnNext(x));
default:
throw new ArgumentException("Invalid binding mode.");
}
diff --git a/src/Avalonia.Base/Data/Core/PropertyAccessorNode.cs b/src/Avalonia.Base/Data/Core/PropertyAccessorNode.cs
index a916142675..df8f46a7d7 100644
--- a/src/Avalonia.Base/Data/Core/PropertyAccessorNode.cs
+++ b/src/Avalonia.Base/Data/Core/PropertyAccessorNode.cs
@@ -59,8 +59,8 @@ namespace Avalonia.Data.Core
$"Could not find a matching property accessor for {PropertyName}.");
}
- accessor.Subscribe(ValueChanged);
_accessor = accessor;
+ accessor.Subscribe(ValueChanged);
}
protected override void StopListeningCore()
diff --git a/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs b/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs
index 942104d61b..73854b9f60 100644
--- a/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs
+++ b/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs
@@ -336,7 +336,18 @@ namespace Avalonia.Controls.Platform
if (e.MouseButton == MouseButton.Left && item?.HasSubMenu == true)
{
- Open(item, false);
+ if (item.IsSubMenuOpen)
+ {
+ if (item.IsTopLevel)
+ {
+ CloseMenu(item);
+ }
+ }
+ else
+ {
+ Open(item, false);
+ }
+
e.Handled = true;
}
}
diff --git a/tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs b/tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs
index 87b235dce7..df1846c617 100644
--- a/tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs
@@ -1,6 +1,7 @@
using System;
using Avalonia.Controls.Platform;
using Avalonia.Input;
+using Avalonia.Interactivity;
using Moq;
using Xunit;
@@ -110,6 +111,22 @@ namespace Avalonia.Controls.UnitTests.Platform
Assert.True(e.Handled);
}
+ [Fact]
+ public void Click_On_Open_TopLevel_Menu_Closes_Menu()
+ {
+ var target = new DefaultMenuInteractionHandler(false);
+ var menu = Mock.Of();
+ var item = Mock.Of(x =>
+ x.IsSubMenuOpen == true &&
+ x.IsTopLevel == true &&
+ x.HasSubMenu == true &&
+ x.Parent == menu);
+ var e = new PointerPressedEventArgs { MouseButton = MouseButton.Left, Source = item };
+
+ target.PointerPressed(item, e);
+ Mock.Get(menu).Verify(x => x.Close());
+ }
+
[Fact]
public void PointerEnter_Opens_Item_When_Old_Item_Is_Open()
{
diff --git a/tests/Avalonia.Markup.UnitTests/Data/BindingTests.cs b/tests/Avalonia.Markup.UnitTests/Data/BindingTests.cs
index baa1bca76a..d19accb0ad 100644
--- a/tests/Avalonia.Markup.UnitTests/Data/BindingTests.cs
+++ b/tests/Avalonia.Markup.UnitTests/Data/BindingTests.cs
@@ -100,6 +100,28 @@ namespace Avalonia.Markup.UnitTests.Data
Assert.Equal("baz", target.Text);
}
+ [Fact]
+ public void OneWayToSource_Binding_Should_React_To_DataContext_Changed()
+ {
+ var target = new TextBlock { Text = "bar" };
+ var binding = new Binding
+ {
+ Path = "Foo",
+ Mode = BindingMode.OneWayToSource,
+ };
+
+ target.Bind(TextBox.TextProperty, binding);
+
+ var source = new Source { Foo = "foo" };
+ target.DataContext = source;
+
+ 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()
{
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BindingTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BindingTests.cs
index fef9dfb675..14abebcdb5 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BindingTests.cs
+++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BindingTests.cs
@@ -329,6 +329,33 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml
Assert.Equal("Hello world", textBlock.Text);
}
- }
+ }
+
+ [Fact]
+ public void Binding_OneWayToSource_Works()
+ {
+ using (UnitTestApplication.Start(TestServices.StyledWindow))
+ {
+ var xaml = @"
+
+";
+ var loader = new AvaloniaXamlLoader();
+ var window = (Window)loader.Load(xaml);
+ var viewModel = new WindowViewModel();
+
+ window.DataContext = viewModel;
+ window.ApplyTemplate();
+
+ Assert.True(window.ShowInTaskbar);
+ Assert.True(viewModel.ShowInTaskbar);
+ }
+ }
+
+ private class WindowViewModel
+ {
+ public bool ShowInTaskbar { get; set; }
+ }
}
}