diff --git a/src/Markup/Avalonia.Markup/AlwaysEnabledDelegateCommand.cs b/src/Markup/Avalonia.Markup/AlwaysEnabledDelegateCommand.cs new file mode 100644 index 0000000000..c675b876ae --- /dev/null +++ b/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); + } + } + } +} diff --git a/src/Markup/Avalonia.Markup/DefaultValueConverter.cs b/src/Markup/Avalonia.Markup/DefaultValueConverter.cs index b56291a653..bb6bd85827 100644 --- a/src/Markup/Avalonia.Markup/DefaultValueConverter.cs +++ b/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; diff --git a/tests/Avalonia.Markup.UnitTests/DefaultValueConverterTests.cs b/tests/Avalonia.Markup.UnitTests/DefaultValueConverterTests.cs index fd28f2e900..0aa2e00c0f 100644 --- a/tests/Avalonia.Markup.UnitTests/DefaultValueConverterTests.cs +++ b/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(result); } + [Fact] + public void Can_Convert_From_Delegate_To_Command() + { + int commandResult = 0; + + var result = DefaultValueConverter.Instance.Convert( + (Action)((int i) => { commandResult = i; }), + typeof(ICommand), + null, + CultureInfo.InvariantCulture); + + Assert.IsAssignableFrom(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(result); + + (result as ICommand).Execute(null); + + Assert.Equal(1, commandResult); + } + private enum TestEnum { Foo,