Browse Source

Added a AddClassHandler<TTarget> extension method.

For PerspexProperties, similar to RoutedEvent.AddClassHandler<TTarget>.
pull/58/head
Steven Kirk 11 years ago
parent
commit
84c68c200d
  1. 1
      Perspex.Base/Perspex.Base.csproj
  2. 53
      Perspex.Base/PerspexObjectExtensions.cs
  3. 24
      Perspex.Controls/MenuItem.cs

1
Perspex.Base/Perspex.Base.csproj

@ -39,6 +39,7 @@
<Compile Include="Binding.cs" />
<Compile Include="Diagnostics\PerspexObjectExtensions.cs" />
<Compile Include="GlobalSuppressions.cs" />
<Compile Include="PerspexObjectExtensions.cs" />
<Compile Include="PerspexProperty`1.cs" />
<Compile Include="PriorityBindingEntry.cs" />
<Compile Include="Collections\IPerspexList.cs" />

53
Perspex.Base/PerspexObjectExtensions.cs

@ -0,0 +1,53 @@
// -----------------------------------------------------------------------
// <copyright file="PerspexObjectExtensions.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex
{
using System;
using System.Reactive.Linq;
/// <summary>
/// Provides extension methods for <see cref="PerspexObject"/> and related classes.
/// </summary>
public static class PerspexObjectExtensions
{
/// <summary>
/// Subscribes to a property changed notifications for changes that originate from a
/// <typeparamref name="TTarget"/>.
/// </summary>
/// <typeparam name="TTarget">The type of the property change sender.</typeparam>
/// <param name="observable">The property changed observable.</param>
/// <param name="handler">Given a TTarget, returns the handler.</param>
/// <returns>A disposable that can be used to terminate the subscription.</returns>
public static IDisposable AddClassHandler<TTarget>(
this IObservable<PerspexPropertyChangedEventArgs> observable,
Func<TTarget, Action<PerspexPropertyChangedEventArgs>> handler)
where TTarget : class
{
return observable.Subscribe(e => SubscribeAdapter(e, handler));
}
/// <summary>
/// Observer method for <see cref="AddClassHandler{TTarget}(IObservable{PerspexPropertyChangedEventArgs},
/// Func{TTarget, Action{PerspexPropertyChangedEventArgs}})"/>.
/// </summary>
/// <typeparam name="TTarget">The sender type to accept.</typeparam>
/// <param name="e">The event args.</param>
/// <param name="handler">Given a TTarget, returns the handler.</param>
private static void SubscribeAdapter<TTarget>(
PerspexPropertyChangedEventArgs e,
Func<TTarget, Action<PerspexPropertyChangedEventArgs>> handler)
where TTarget : class
{
var target = e.Sender as TTarget;
if (target != null)
{
handler(target)(e);
}
}
}
}

24
Perspex.Controls/MenuItem.cs

@ -84,7 +84,7 @@ namespace Perspex.Controls
FocusableProperty.OverrideDefaultValue<MenuItem>(true);
ClickEvent.AddClassHandler<MenuItem>(x => x.OnClick);
SubmenuOpenedEvent.AddClassHandler<MenuItem>(x => x.OnSubmenuOpened);
IsSubMenuOpenProperty.Changed.Subscribe(SubMenuOpenChanged);
IsSubMenuOpenProperty.Changed.AddClassHandler<MenuItem>(x => x.SubMenuOpenChanged);
}
/// <summary>
@ -383,23 +383,19 @@ namespace Perspex.Controls
/// Called when the <see cref="IsSubMenuOpen"/> property changes.
/// </summary>
/// <param name="e">The property change event.</param>
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;
}
}

Loading…
Cancel
Save