Панель инструментов форм XamarinItem не меняет IsEnabled с XAML - PullRequest
3 голосов
/ 10 марта 2019

У меня возникает проблема со свойством ToolbarItem и IsEnabled при попытке включить / выключить его из XAML с помощью триггеров.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 EventHandler

btnTest.IsVisible is false , я просто показываю это для целей тестирования.

Есть идеи о том, как с этим бороться?

Ответы [ 2 ]

2 голосов
/ 10 марта 2019

Это связано с тем, что свойство IsEnabled ToolbarItem имеет значение только для чтения .

Если вы просто установите для свойства IsEnabled элемента панели инструментов в вашем XAML значение false или true, вы получите следующее исключение во время выполнения.

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

И если вы посмотрите на документацию Microsoft , вы заметите, что не можете напрямую установить свойство IsEnabled элемента панели инструментов.

Для отключения элемента панели инструментов рекомендуется использовать команду и ее CanExecute.

1 голос
/ 04 апреля 2019

Я нашел способ решить эту проблему, по крайней мере, лучше, чем реализация 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; внутри конструктора, и все будет так гладко, как я хочу.

...