Browse Source

Merge branch 'master' into fix-animation-triggers

Jumar Macato 7 years ago
parent
commit
829260ff39

+ 19 - 1
src/Avalonia.Controls/MenuItem.cs

@@ -99,13 +99,13 @@ namespace Avalonia.Controls
             SelectableMixin.Attach<MenuItem>(IsSelectedProperty);
             CommandProperty.Changed.Subscribe(CommandChanged);
             FocusableProperty.OverrideDefaultValue<MenuItem>(true);
+            HeaderProperty.Changed.AddClassHandler<MenuItem>(x => x.HeaderChanged);
             IconProperty.Changed.AddClassHandler<MenuItem>(x => x.IconChanged);
             IsSelectedProperty.Changed.AddClassHandler<MenuItem>(x => x.IsSelectedChanged);
             ItemsPanelProperty.OverrideDefaultValue<MenuItem>(DefaultPanel);
             ClickEvent.AddClassHandler<MenuItem>(x => x.OnClick);
             SubmenuOpenedEvent.AddClassHandler<MenuItem>(x => x.OnSubmenuOpened);
             IsSubMenuOpenProperty.Changed.AddClassHandler<MenuItem>(x => x.SubMenuOpenChanged);
-            PseudoClass<MenuItem, object>(HeaderProperty, x => x as string == "-", ":separator");
         }
 
         public MenuItem()
@@ -420,6 +420,24 @@ namespace Avalonia.Controls
             IsEnabled = Command == null || Command.CanExecute(CommandParameter);
         }
 
+        /// <summary>
+        /// Called when the <see cref="Header"/> property changes.
+        /// </summary>
+        /// <param name="e">The property change event.</param>
+        private void HeaderChanged(AvaloniaPropertyChangedEventArgs e)
+        {
+            if (e.NewValue is string newValue && newValue == "-")
+            {
+                PseudoClasses.Add(":separator");
+                Focusable = false;
+            }
+            else if (e.OldValue is string oldValue && oldValue == "-")
+            {
+                PseudoClasses.Remove(":separator");
+                Focusable = true;
+            }
+        }
+
         /// <summary>
         /// Called when the <see cref="Icon"/> property changes.
         /// </summary>

+ 13 - 1
tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs

@@ -479,6 +479,18 @@ namespace Avalonia.Base.UnitTests
             Assert.False(source.SetterCalled);
         }
 
+        [Fact]
+        public void Disposing_Completed_Binding_Does_Not_Throw()
+        {
+            var target = new Class1();
+            var source = new Subject<string>();
+            var subscription = target.Bind(Class1.FooProperty, source);
+
+            source.OnCompleted();
+
+            subscription.Dispose();
+        }
+
         /// <summary>
         /// Returns an observable that returns a single value but does not complete.
         /// </summary>
@@ -595,4 +607,4 @@ namespace Avalonia.Base.UnitTests
             public bool SetterCalled { get; private set; }
         }
     }
-}
+}

+ 26 - 0
tests/Avalonia.Controls.UnitTests/MenuItemTests.cs

@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Xunit;
+
+namespace Avalonia.Controls.UnitTests
+{
+    public class MenuItemTests
+    {
+        [Fact]
+        public void Header_Of_Minus_Should_Apply_Separator_Pseudoclass()
+        {
+            var target = new MenuItem { Header = "-" };
+
+            Assert.True(target.Classes.Contains(":separator"));
+        }
+
+        [Fact]
+        public void Separator_Item_Should_Set_Focusable_False()
+        {
+            var target = new MenuItem { Header = "-" };
+
+            Assert.False(target.Focusable);
+        }
+    }
+}