Browse Source

Add delegate -> command conversion as a default value conversion.

pull/1179/head
Jeremy Koritzinsky 9 years ago
parent
commit
250f6acef0
  1. 36
      src/Markup/Avalonia.Markup/AlwaysEnabledDelegateCommand.cs
  2. 6
      src/Markup/Avalonia.Markup/DefaultValueConverter.cs
  3. 38
      tests/Avalonia.Markup.UnitTests/DefaultValueConverterTests.cs

36
src/Markup/Avalonia.Markup/AlwaysEnabledDelegateCommand.cs

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Input;
namespace Avalonia.Markup
{
class AlwaysEnabledDelegateCommand : ICommand
{
private readonly Delegate action;
public AlwaysEnabledDelegateCommand(Delegate action)
{
this.action = action;
}
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
if (action.Method.GetParameters().Length == 0)
{
action.DynamicInvoke();
}
else
{
action.DynamicInvoke(parameter);
}
}
}
}

6
src/Markup/Avalonia.Markup/DefaultValueConverter.cs

@ -5,6 +5,7 @@ using System;
using System.Globalization;
using Avalonia.Data;
using Avalonia.Utilities;
using System.Windows.Input;
namespace Avalonia.Markup
{
@ -34,6 +35,11 @@ namespace Avalonia.Markup
return AvaloniaProperty.UnsetValue;
}
if (typeof(ICommand).IsAssignableFrom(targetType) && value is Delegate d)
{
return new AlwaysEnabledDelegateCommand(d);
}
if (TypeUtilities.TryConvert(targetType, value, culture, out object result))
{
return result;

38
tests/Avalonia.Markup.UnitTests/DefaultValueConverterTests.cs

@ -5,6 +5,8 @@ using System.Globalization;
using Avalonia.Controls;
using Avalonia.Data;
using Xunit;
using System.Windows.Input;
using System;
namespace Avalonia.Markup.UnitTests
{
@ -118,6 +120,42 @@ namespace Avalonia.Markup.UnitTests
Assert.IsType<BindingNotification>(result);
}
[Fact]
public void Can_Convert_From_Delegate_To_Command()
{
int commandResult = 0;
var result = DefaultValueConverter.Instance.Convert(
(Action<int>)((int i) => { commandResult = i; }),
typeof(ICommand),
null,
CultureInfo.InvariantCulture);
Assert.IsAssignableFrom<ICommand>(result);
(result as ICommand).Execute(5);
Assert.Equal(5, commandResult);
}
[Fact]
public void Can_Convert_From_Delegate_To_Command_No_Parameters()
{
int commandResult = 0;
var result = DefaultValueConverter.Instance.Convert(
(Action)(() => { commandResult = 1; }),
typeof(ICommand),
null,
CultureInfo.InvariantCulture);
Assert.IsAssignableFrom<ICommand>(result);
(result as ICommand).Execute(null);
Assert.Equal(1, commandResult);
}
private enum TestEnum
{
Foo,

Loading…
Cancel
Save