diff --git a/src/Avalonia.Controls/Button.cs b/src/Avalonia.Controls/Button.cs
index 7abb47f963..6912b2db63 100644
--- a/src/Avalonia.Controls/Button.cs
+++ b/src/Avalonia.Controls/Button.cs
@@ -96,6 +96,7 @@ namespace Avalonia.Controls
{
FocusableProperty.OverrideDefaultValue(typeof(Button), true);
CommandProperty.Changed.Subscribe(CommandChanged);
+ CommandParameterProperty.Changed.Subscribe(CommandParameterChanged);
IsDefaultProperty.Changed.Subscribe(IsDefaultChanged);
IsCancelProperty.Changed.Subscribe(IsCancelChanged);
}
@@ -418,6 +419,18 @@ namespace Avalonia.Controls
}
}
+ ///
+ /// Called when the property changes.
+ ///
+ /// The event args.
+ private static void CommandParameterChanged(AvaloniaPropertyChangedEventArgs e)
+ {
+ if (e.Sender is Button button)
+ {
+ button.CanExecuteChanged(button, EventArgs.Empty);
+ }
+ }
+
///
/// Called when the property changes.
///
diff --git a/tests/Avalonia.Controls.UnitTests/ButtonTests.cs b/tests/Avalonia.Controls.UnitTests/ButtonTests.cs
index 7ad0e480c6..c9ad24e654 100644
--- a/tests/Avalonia.Controls.UnitTests/ButtonTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/ButtonTests.cs
@@ -269,6 +269,19 @@ namespace Avalonia.Controls.UnitTests
Assert.Equal(0, command.SubscriptionCount);
}
+ [Fact]
+ public void Button_Invokes_CanExecute_When_CommandParameter_Changed()
+ {
+ var command = new TestCommand(p => p is bool value && value);
+ var target = new Button { Command = command };
+
+ target.CommandParameter = true;
+ Assert.True(target.IsEffectivelyEnabled);
+
+ target.CommandParameter = false;
+ Assert.False(target.IsEffectivelyEnabled);
+ }
+
private class TestButton : Button, IRenderRoot
{
public TestButton()
@@ -324,12 +337,22 @@ namespace Avalonia.Controls.UnitTests
private class TestCommand : ICommand
{
+ private readonly Func