diff --git a/samples/BindingDemo/MainWindow.xaml b/samples/BindingDemo/MainWindow.xaml
index 14c371efef..b583503327 100644
--- a/samples/BindingDemo/MainWindow.xaml
+++ b/samples/BindingDemo/MainWindow.xaml
@@ -116,6 +116,7 @@
+
diff --git a/samples/BindingDemo/ViewModels/MainWindowViewModel.cs b/samples/BindingDemo/ViewModels/MainWindowViewModel.cs
index 66800a606c..e74d4cbcc8 100644
--- a/samples/BindingDemo/ViewModels/MainWindowViewModel.cs
+++ b/samples/BindingDemo/ViewModels/MainWindowViewModel.cs
@@ -7,6 +7,7 @@ using System.Threading.Tasks;
using System.Threading;
using ReactiveUI;
using Avalonia.Controls;
+using Avalonia.Metadata;
namespace BindingDemo.ViewModels
{
@@ -102,5 +103,16 @@ namespace BindingDemo.ViewModels
get { return _nested; }
private set { this.RaiseAndSetIfChanged(ref _nested, value); }
}
+
+ public void Do(object parameter)
+ {
+
+ }
+
+ [DependsOn(nameof(BooleanFlag))]
+ bool CanDo(object parameter)
+ {
+ return BooleanFlag;
+ }
}
}
diff --git a/src/Avalonia.Base/Data/Converters/AlwaysEnabledDelegateCommand.cs b/src/Avalonia.Base/Data/Converters/AlwaysEnabledDelegateCommand.cs
deleted file mode 100644
index 7f4c83772d..0000000000
--- a/src/Avalonia.Base/Data/Converters/AlwaysEnabledDelegateCommand.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using System;
-using System.Globalization;
-using System.Reflection;
-using System.Windows.Input;
-using Avalonia.Utilities;
-
-namespace Avalonia.Data.Converters
-{
- class AlwaysEnabledDelegateCommand : ICommand
- {
- private readonly Delegate action;
-
- private ParameterInfo parameterInfo;
-
- public AlwaysEnabledDelegateCommand(Delegate action)
- {
- this.action = action;
- var parameters = action.Method.GetParameters();
- parameterInfo = parameters.Length == 0 ? null : parameters[0];
- }
-
-#pragma warning disable 0067
- public event EventHandler CanExecuteChanged;
-#pragma warning restore 0067
-
- public bool CanExecute(object parameter) => true;
-
- public void Execute(object parameter)
- {
- if (parameterInfo == null)
- {
- action.DynamicInvoke();
- }
- else
- {
- TypeUtilities.TryConvert(parameterInfo.ParameterType, parameter, CultureInfo.CurrentCulture, out object convertedParameter);
- action.DynamicInvoke(convertedParameter);
- }
- }
- }
-}
diff --git a/src/Avalonia.Base/Data/Converters/DefaultValueConverter.cs b/src/Avalonia.Base/Data/Converters/DefaultValueConverter.cs
index 5e80a15059..83f7e02c16 100644
--- a/src/Avalonia.Base/Data/Converters/DefaultValueConverter.cs
+++ b/src/Avalonia.Base/Data/Converters/DefaultValueConverter.cs
@@ -33,7 +33,7 @@ namespace Avalonia.Data.Converters
if (typeof(ICommand).IsAssignableFrom(targetType) && value is Delegate d && d.Method.GetParameters().Length <= 1)
{
- return new AlwaysEnabledDelegateCommand(d);
+ return new MethodToCommandConverter(d);
}
if (TypeUtilities.TryConvert(targetType, value, culture, out object result))
diff --git a/src/Avalonia.Base/Data/Converters/MethodToCommandConverter.cs b/src/Avalonia.Base/Data/Converters/MethodToCommandConverter.cs
new file mode 100644
index 0000000000..7e7417d2f5
--- /dev/null
+++ b/src/Avalonia.Base/Data/Converters/MethodToCommandConverter.cs
@@ -0,0 +1,230 @@
+using System;
+using System.ComponentModel;
+using System.Globalization;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.Windows.Input;
+using Avalonia.Utilities;
+
+namespace Avalonia.Data.Converters
+{
+ class MethodToCommandConverter : ICommand
+ {
+ readonly static Func