Xamarin 绑定 IsEnabled 不起作用

Xamarin binding IsEnabled does not works

我有一个奇怪的问题,绑定似乎完全被忽略了。

我的xaml

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

我的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 = "";
}

我希望当此页面打开时 ButtonOK 被禁用,但事实并非如此。

当我设置断点时 breakpoint 1(在 getter 中)永远不会命中,就像 xaml IsEnabled="{Binding ButtonEnabled}" 被忽略一样。
breakpoint 2 命中,value = false

我在这里错过了什么?

我用谷歌搜索了这个问题,发现了很多类似的问题,但是给出的所有解决方案都不能解决我的问题。


How to disable a button until all entries are filled?

还有更多

我猜你正在使用 xaml.cs 页面来保存你的绑定,因此如果你这样做,有两种方法可以做到这一点

在 InitializeComponent

之前或之后的构造函数中将 BindingContext 设置为当前 class
BindingContext= this;

或者在你的XAML

 <ContentPage

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

在你的按钮中

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

我会这样做:将我的按钮设置为 XAML 禁用。

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

然后在我的 Entry 控件上添加 属性 TextChanged。

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

在 xaml.cs 文件上:

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