diff --git a/src/Controls/samples/Controls.Sample/Pages/Layouts/LayoutIsEnabledPage.xaml b/src/Controls/samples/Controls.Sample/Pages/Layouts/LayoutIsEnabledPage.xaml
new file mode 100644
index 000000000000..b2ef53993422
--- /dev/null
+++ b/src/Controls/samples/Controls.Sample/Pages/Layouts/LayoutIsEnabledPage.xaml
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Controls/samples/Controls.Sample/Pages/Layouts/LayoutIsEnabledPage.xaml.cs b/src/Controls/samples/Controls.Sample/Pages/Layouts/LayoutIsEnabledPage.xaml.cs
new file mode 100644
index 000000000000..42141315c1b8
--- /dev/null
+++ b/src/Controls/samples/Controls.Sample/Pages/Layouts/LayoutIsEnabledPage.xaml.cs
@@ -0,0 +1,78 @@
+using System;
+using Microsoft.Maui.Controls;
+
+namespace Maui.Controls.Sample.Pages
+{
+ public partial class LayoutIsEnabledPage : ContentPage
+ {
+ bool isLayoutEnabled;
+ bool isButtonEnabled;
+ bool isCommandEnabled;
+
+ public LayoutIsEnabledPage()
+ {
+ InitializeComponent();
+
+ TheCommand = new Command(OnThe, OnTheCanExecute);
+ BindingContext = this;
+ }
+
+ public bool IsLayoutEnabled
+ {
+ get => isLayoutEnabled;
+ set
+ {
+ isLayoutEnabled = value;
+ OnPropertyChanged();
+ }
+ }
+
+ public bool IsButtonEnabled
+ {
+ get => isButtonEnabled;
+ set
+ {
+ isButtonEnabled = value;
+ OnPropertyChanged();
+ }
+ }
+
+ public bool IsCommandEnabled
+ {
+ get => isCommandEnabled;
+ set
+ {
+ isCommandEnabled = value;
+ OnPropertyChanged();
+ TheCommand.ChangeCanExecute();
+ }
+ }
+
+ public Command TheCommand { get; }
+
+ void OnDisableLayoutBtnClicked(object sender, EventArgs e)
+ {
+ MainLayout.IsEnabled = !MainLayout.IsEnabled;
+
+ ((Button)sender).Text = MainLayout.IsEnabled ? "Disable Layout" : "Enable Layout";
+ }
+
+ void OnDisableButtonBtnClicked(object sender, EventArgs e)
+ {
+ DisabledButton.IsEnabled = !DisabledButton.IsEnabled;
+ DisabledCommandButton.IsEnabled = !DisabledCommandButton.IsEnabled;
+
+ DisabledButton.Text = DisabledButton.IsEnabled ? "Enabled" : "Disabled";
+ DisabledCommandButton.Text = DisabledCommandButton.IsEnabled ? "Enabled" : "Disabled";
+
+ ((Button)sender).Text = DisabledButton.IsEnabled ? "Disable Button" : "Enable Button";
+ }
+
+ void OnThe()
+ {
+ System.Diagnostics.Debug.WriteLine("On THE clicked!");
+ }
+
+ bool OnTheCanExecute() => isCommandEnabled;
+ }
+}
\ No newline at end of file
diff --git a/src/Controls/samples/Controls.Sample/ViewModels/LayoutsViewModel.cs b/src/Controls/samples/Controls.Sample/ViewModels/LayoutsViewModel.cs
index 81bb4bb2b281..60493c65ceed 100644
--- a/src/Controls/samples/Controls.Sample/ViewModels/LayoutsViewModel.cs
+++ b/src/Controls/samples/Controls.Sample/ViewModels/LayoutsViewModel.cs
@@ -50,6 +50,9 @@ protected override IEnumerable CreateItems() => new[]
new SectionModel(typeof(CustomLayoutPage), "Custom Layout",
"Demonstrations of custom layout."),
+
+ new SectionModel(typeof(LayoutIsEnabledPage), "Layout IsEnabled",
+ "Demonstrations of enabling/disabling a layout."),
};
}
}
\ No newline at end of file
diff --git a/src/Controls/src/Core/BindableObjectExtensions.cs b/src/Controls/src/Core/BindableObjectExtensions.cs
index 8dbde6e07abb..8467add5eb09 100644
--- a/src/Controls/src/Core/BindableObjectExtensions.cs
+++ b/src/Controls/src/Core/BindableObjectExtensions.cs
@@ -8,6 +8,22 @@ namespace Microsoft.Maui.Controls
///
public static class BindableObjectExtensions
{
+ internal static void RefreshPropertyValue(this BindableObject self, BindableProperty property, object value)
+ {
+ var ctx = self.GetContext(property);
+ if (ctx?.Binding is not null)
+ {
+ // support bound properties
+ if (!ctx.Attributes.HasFlag(BindableObject.BindableContextAttributes.IsBeingSet))
+ ctx.Binding.Apply(false);
+ }
+ else
+ {
+ // support normal/code properties
+ self.SetValue(property, value);
+ }
+ }
+
internal static void PropagateBindingContext(this BindableObject self, IEnumerable children)
{
PropagateBindingContext(self, children, BindableObject.SetInheritedBindingContext);
diff --git a/src/Controls/src/Core/Button.cs b/src/Controls/src/Core/Button.cs
index cb427a287b05..27ed73b79592 100644
--- a/src/Controls/src/Core/Button.cs
+++ b/src/Controls/src/Core/Button.cs
@@ -12,7 +12,7 @@ namespace Microsoft.Maui.Controls
///
/// A button that reacts to touch events.
///
- public partial class Button : View, IFontElement, ITextElement, IBorderElement, IButtonController, IElementConfiguration