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;
}
}
我有一个奇怪的问题,绑定似乎完全被忽略了。
我的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 设置为当前 classBindingContext= 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;
}
}