Xamarin Forms ToolbarItem不会从XAML更改IsEnabled

时间:2019-03-10 15:12:09

标签: xamarin.forms toolbaritems

在尝试使用触发器从XAML启用/禁用属性时,我遇到ToolbarItemIsEnabled属性的问题。 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 ,我只是出于测试目的而显示它。

关于如何处理此问题的任何想法?

2 个答案:

答案 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。