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; } + } } }