在尝试使用触发器从XAML启用/禁用属性时,我遇到ToolbarItem
和IsEnabled
属性的问题。 ToolbarItem
不支持触发器,所以我要做的是创建一个支持触发器的Button
(一个隐藏的触发器),然后将Button.IsEnabled
绑定到ToolbarItem.IsEnabled
;这是示例代码:
<ContentPage.ToolbarItems>
<ToolbarItem x:Name="tlbSave" Text="Save" Clicked="Handle_Clicked">
<ToolbarItem.IsEnabled>
<Binding Source="{x:Reference btnTest}" Path="IsEnabled" />
</ToolbarItem.IsEnabled>
</ToolbarItem>
</ContentPage.ToolbarItems>
<ContentPage.Content>
<StackLayout Padding="10" VerticalOptions="CenterAndExpand">
<Entry x:Name="txtTest" HorizontalOptions="FillAndExpand" />
<Button x:Name="btnTest" Text="HIDDEN" IsEnabled="false" HorizontalOptions="FillAndExpand">
<Button.Triggers>
<MultiTrigger TargetType="Button">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding Source={x:Reference txtTest}, Path=Text.Length,
Converter={convert:IsPositiveIntegerConverter}}" Value="true" />
</MultiTrigger.Conditions>
<Setter Property="IsEnabled" Value="True" />
</MultiTrigger>
</Button.Triggers>
</Button>
</StackLayout>
</ContentPage.Content>
如果您尝试这段代码,您将看到btnTest
具有一定价值时如何启用/禁用txtTest.Text
。但这不会影响tlbSave.IsEnabled
属性。
但是,当我在tlbSave.IsEnabled
中将btnText.PropertyChanged
设置为btnTest.IsVisible
EventHandler
def rangeStartEndPrime(v1, v2):
import math
check_prime = (v1,v2+1)
for num in check_prime:
is_prime = True
for i in range(2, int(num**0.5) + 1):
if (num % i) == 0:
is_prime = False
return int(is_prime == True)
number1 = int(input("Please enter start value: "))
number2 = int(input("Please enter end value: "))
range = rangeStartEndPrime(number1, number2)
print(range)
是 false ,我只是出于测试目的而显示它。
关于如何处理此问题的任何想法?
答案 0 :(得分:1)
我找到了解决此问题的方法,至少比为OnPropertyChange
实现btnTest
更好的方法
<ContentPage.ToolbarItems>
<ToolbarItem x:Name="tlbSave" Text="Save" Clicked="Handle_Clicked" />
</ContentPage.ToolbarItems>
<ContentPage.Content>
<StackLayout Padding="10" VerticalOptions="CenterAndExpand">
<Entry x:Name="txtTest" HorizontalOptions="FillAndExpand" />
<Button x:Name="btnTest" Text="HIDDEN">
<Button.Triggers>
<MultiTrigger TargetType="Button">
<MultiTrigger.Conditions>
<BindingCondition Binding="{Binding Source={x:Reference txtTest}, Path=Text.Length,
Converter={convert:IsPositiveIntegerConverter}}" Value="true" />
</MultiTrigger.Conditions>
<Setter Property="IsEnabled" Value="True" />
</MultiTrigger>
</Button.Triggers>
<Button.IsEnabled>
<Binding Source="{x:Reference tlbSave}" Path="IsEnabled" Mode="OneWayToSource" />
</Button.IsEnabled>
</Button>
</StackLayout>
</ContentPage.Content>
然后在构造函数中设置btnTest.IsEnabled = false;
,一切都会按照我想要的顺利进行。
答案 1 :(得分:0)
这是因为ToolbarItem的IsEnabled属性为只读。
如果仅将XAML中工具栏项的IsEnabled属性设置为false或true,则在运行时将收到以下异常。
System.InvalidOperationException: The BindableProperty "IsEnabled" is readonly.
如果您查看Microsoft's documentation,您会发现您无法直接设置工具栏项的IsEnabled属性。
要禁用工具栏项,建议的方法是使用命令及其CanExecute。