【问题标题】:Xamarin Forms ToolbarItem doesn't change IsEnabled from XAMLXamarin Forms ToolbarItem 不会从 XAML 更改 IsEnabled
【发布时间】:2019-04-10 02:16:56
【问题描述】:

我在尝试使用触发器从 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>

如果您尝试这段代码,您将看到btnTesttxtTest.Text 具有一定价值时如何启用/禁用。但它不会影响tlbSave.IsEnabled 属性。

但是,当我将 tlbSave.IsEnabled 设置为 btnText.PropertyChanged EventHandler

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

知道如何处理这个问题吗?

【问题讨论】:

  • 您究竟为什么要使用触发器?好奇心!你的绑定也不应该像&lt;ToolbarItem IsEnabled={Binding IsEnabled, Source="{x:Reference btnTest}}" /&gt;
  • 同理,只是换一种方式

标签: xamarin.forms toolbaritems


【解决方案1】:

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

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

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

如果你看一下Microsoft's documentation,你会注意到你不能直接设置工具栏项的 IsEnabled 属性。

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

【讨论】:

  • 在 XAML 中,我们不能将布尔值分配给 IsEnabled,因为它是可绑定的属性。但是在后面的代码中我可以改变它的值。
  • “禁用工具栏项”对您有用吗?我已经看到 2015 年的错误报告说它不会基于 CanExecute 禁用并且仍然执行。我在 XF 4.4 上,CanExecute 现在似乎也没有得到尊重
  • 您从哪里看到它是只读的?有一个getter和一个setter。我能看到的唯一通知是供 Xamarin.Forms 平台内部使​​用。
【解决方案2】:

我找到了解决这个问题的方法,至少比为btnTest 实现OnPropertyChange 更好

    <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;,一切都会如我所愿地顺利进行。

【讨论】:

    猜你喜欢
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 2015-07-01
    • 2018-01-01
    • 2016-09-24
    • 2022-01-08
    • 2015-05-21
    相关资源
    最近更新 更多