Home > front end >  Xamarin binding IsEnabled does not works
Xamarin binding IsEnabled does not works

Time:02-15

I have this strange problem, where the binding seems completely ignored.

my xaml

<Button IsEnabled="{Binding ButtonEnabled}" x:Name="ButtonOK" BackgroundColor="Green" TextColor="White" Text="OK"/>

my C#

private bool _buttonEnabled = false;


public bool ButtonEnabled
{
    get 
    { 
        // breakpoint 1, which never hits with value = false
        return _buttonEnabled; 
    }
    set
    {
        // breakpoint 2, which hits
        _buttonEnabled = value;
        OnPropertyChanged(nameof(ButtonEnabled));
    }
}


private void ChassisEntry_TextChanged(object sender, TextChangedEventArgs e)
{
    ButtonEnabled = ChassisEntry.Text != "";
}

private void PageScan_Appearing(object sender, EventArgs e)
{
    ChassisEntry.Text = "";
}

I expect that when this page opens that ButtonOK is disabled, but it is not.

When I set breakpoints then breakpoint 1 (in the getter) never hits, its like if the xaml IsEnabled="{Binding ButtonEnabled}" is ignored.
The breakpoint 2 does hits, with value = false

What am I missing here ?

I googled this problem and found many similar questions, but all solutions given do not help with my problem.

Button IsEnabled binding not working properly
How to disable a button until all entries are filled?
Disable/Enable save button based on the mandatory field being null or empty using Behaviors
and many more

CodePudding user response:

I am guessing you are using the xaml.cs page for holding your Bindings and hence if you are doing that there are two ways to use

Set the BindingContext to the current class in the constructor before or right after InitializeComponent

BindingContext= this;

Or In your XAML

 <ContentPage

 .... 
 x:Name="currentPage">

And in your button

<Button IsEnabled="{Binding ButtonEnabled, Source={x:Reference currentPage}}"

CodePudding user response:

I would go with this: Set my Button in my XAML disabled.

<Button IsEnabled="False" x:Name="ButtonOK" BackgroundColor="Green" TextColor="White" Text="OK"/>

Then on my Entry control i would add the property TextChanged.

<Entry x:Name="ChassisEntry"
   PlaceholderColor="DarkGray"
   TextChanged="ChassisEntryChanged">

On xaml.cs file:

private void ChassisEntryChanged(object sender, TextChangedEventArgs e)
{
    if (e.NewTextValue.Text != "")
    {
        ButtonOK.IsEnabled = true;
    }
    else
    {
        ButtonOK.IsEnabled = false;
    }
}
  • Related