From 84c68c200d318246181010f2cf84c312436ab85b Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 11 Jun 2015 22:13:34 +0200 Subject: [PATCH] Added a AddClassHandler extension method. For PerspexProperties, similar to RoutedEvent.AddClassHandler. --- Perspex.Base/Perspex.Base.csproj | 1 + Perspex.Base/PerspexObjectExtensions.cs | 53 +++++++++++++++++++++++++ Perspex.Controls/MenuItem.cs | 24 +++++------ 3 files changed, 64 insertions(+), 14 deletions(-) create mode 100644 Perspex.Base/PerspexObjectExtensions.cs diff --git a/Perspex.Base/Perspex.Base.csproj b/Perspex.Base/Perspex.Base.csproj index 56b4bb0a48..2add7a6b12 100644 --- a/Perspex.Base/Perspex.Base.csproj +++ b/Perspex.Base/Perspex.Base.csproj @@ -39,6 +39,7 @@ + diff --git a/Perspex.Base/PerspexObjectExtensions.cs b/Perspex.Base/PerspexObjectExtensions.cs new file mode 100644 index 0000000000..c40266b4f6 --- /dev/null +++ b/Perspex.Base/PerspexObjectExtensions.cs @@ -0,0 +1,53 @@ +// ----------------------------------------------------------------------- +// +// Copyright 2015 MIT Licence. See licence.md for more information. +// +// ----------------------------------------------------------------------- + +namespace Perspex +{ + using System; + using System.Reactive.Linq; + + /// + /// Provides extension methods for and related classes. + /// + public static class PerspexObjectExtensions + { + /// + /// Subscribes to a property changed notifications for changes that originate from a + /// . + /// + /// The type of the property change sender. + /// The property changed observable. + /// Given a TTarget, returns the handler. + /// A disposable that can be used to terminate the subscription. + public static IDisposable AddClassHandler( + this IObservable observable, + Func> handler) + where TTarget : class + { + return observable.Subscribe(e => SubscribeAdapter(e, handler)); + } + + /// + /// Observer method for . + /// + /// The sender type to accept. + /// The event args. + /// Given a TTarget, returns the handler. + private static void SubscribeAdapter( + PerspexPropertyChangedEventArgs e, + Func> handler) + where TTarget : class + { + var target = e.Sender as TTarget; + + if (target != null) + { + handler(target)(e); + } + } + } +} diff --git a/Perspex.Controls/MenuItem.cs b/Perspex.Controls/MenuItem.cs index fe5b5adf90..26e125ec33 100644 --- a/Perspex.Controls/MenuItem.cs +++ b/Perspex.Controls/MenuItem.cs @@ -84,7 +84,7 @@ namespace Perspex.Controls FocusableProperty.OverrideDefaultValue(true); ClickEvent.AddClassHandler(x => x.OnClick); SubmenuOpenedEvent.AddClassHandler(x => x.OnSubmenuOpened); - IsSubMenuOpenProperty.Changed.Subscribe(SubMenuOpenChanged); + IsSubMenuOpenProperty.Changed.AddClassHandler(x => x.SubMenuOpenChanged); } /// @@ -383,23 +383,19 @@ namespace Perspex.Controls /// Called when the property changes. /// /// The property change event. - private static void SubMenuOpenChanged(PerspexPropertyChangedEventArgs e) + private void SubMenuOpenChanged(PerspexPropertyChangedEventArgs e) { - var sender = e.Sender as MenuItem; var value = (bool)e.NewValue; - if (sender != null) + if (value) { - if (value) - { - sender.RaiseEvent(new RoutedEventArgs(SubmenuOpenedEvent)); - sender.IsSelected = true; - } - else - { - sender.CloseSubmenus(); - sender.SelectedIndex = -1; - } + this.RaiseEvent(new RoutedEventArgs(SubmenuOpenedEvent)); + this.IsSelected = true; + } + else + { + this.CloseSubmenus(); + this.SelectedIndex = -1; } }