9

尝试使用触发器从 XAML 打开/关闭它时,我遇到了ToolbarItem和属性的问题。不支持触发器,所以我要做的是创建一个支持触发器的(隐藏的),然后绑定到;这是示例代码:IsEnabledToolbarItemButtonButton.IsEnabledToolbarItem.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但是,当我设置为EventHandler时,这项工作在后面的代码中非常完美btnText.PropertyChanged

btnTest.IsVisible的,我只是为了测试目的而展示它。

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

4

2 回答 2

8

这是因为 ToolbarItem 的 IsEnabled 属性是只读的

如果您只是将 XAML 中工具栏项的 IsEnabled 属性设置为 false 或 true,您将在运行时收到以下异常。

System.InvalidOperationException: The BindableProperty "IsEnabled" is readonly.

如果您查看Microsoft 的文档,您会注意到您不能直接设置工具栏项的 IsEnabled 属性。

要禁用工具栏项,建议的方法是使用命令,它是 CanExecute。

于 2019-03-10T20:54:44.623 回答
2

我找到了解决这个问题的方法,至少比实施OnPropertyChangeforbtnTest

    <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;在构造函数中设置,一切都会像我想要的那样顺利。

于 2019-04-04T13:38:33.073 回答