Xamarin ControlTemplate Trigger применяется к внутреннему элементу управления в шаблоне - PullRequest
0 голосов
/ 16 апреля 2020

Исходя из моего первоначального поста , я пытался создать собственный элемент управления и создать для него шаблон элемента управления, как в WPF, но потерпел неудачу при триггерах. Мне предоставили ссылку, которая указала, что шаблоны управления разрешены не для всех элементов управления, а только для определенных, через другую ссылку S / O, предоставленную @ Raimo для моего другого вопроса.

Так что теперь к части 2. Я изменил элемент управления с типа «Entry» на тип «ContentView», чтобы можно было применить шаблон элемента управления. Так что это единственное, что изменилось

namespace MyAndroidApp
{
    public class MyTextboxEntry : ContentView
    {
        public MyTextboxEntry()
        {}

        public static readonly BindableProperty IsRequiredProperty 
            = BindableProperty.Create(nameof(IsRequired), typeof(bool),
                typeof(MyTextboxEntry), false, BindingMode.TwoWay);
        public bool IsRequired
        {
            get { return (bool)GetValue(IsRequiredProperty); }
            set { SetValue(IsRequiredProperty, value); }
        }
    }
}

Ссылки на пространство имен ..

xmlns:myCtrls="clr-namespace:MyAndroidApp"

Теперь перейдем к шаблону управления. Я на самом деле определяю несколько частей в элементе управления, но сокращенно здесь для простого контекста.

<ControlTemplate x:Key="CT_MyTextboxEntry" >
    <!--having a grid as an outer wrapper for multiple internal controls...-->
    <Grid HorizontalOptions="StartAndExpand" x:Name="UpdateThisGridControl" >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="150*" />
            <ColumnDefinition Width="50" />
            <ColumnDefinition Width="16" />
        </Grid.ColumnDefinitions>


        <Entry Text="Sample" Grid.Column="0"  />
        <Label Text="junk" Grid.Column="1" />
        <Image Source="Sample.jpg" Grid.Column="2" />

    <Grid.Triggers>
        <Trigger TargetType="myCtrls:MyTextboxEntry" Property="IsRequired" Value="True">
            <Setter Property="BackgroundColor" Value="Red"/>
        </Trigger>
    </Grid.Triggers>

    </Grid>
</ControlTemplate>

И последний экземпляр элемента управления на странице будет отображаться через

<myCtrls:MyTextboxEntry ControlTemplate="{StaticResource CT_MyTextboxEntry}" />

. моя ошибка находится в разделе Grid.Triggers. Намерение здесь состоит в том, чтобы использовать свойство bindable нового элемента управления вводом (на основе ContentView) с надлежащим объявлением BindableProperty для «IsRequired», но установить цвет фона GRID.

В WPF вы можете сказать используйте триггер из этой вещи здесь, но обновите этот другой элемент управления в шаблоне элемента управления, на который ссылается ссылка «x: Name», которую я имею в качестве «UpdateThisGridControl».

Если я отключаю [Grid .Triggers] часть, элемент управления и шаблон показывают как ожидалось. Как только я включаю триггер, он выходит из строя с

"bindable not an instance of AssociatedType

Но, если учесть, что запись ContentView имеет свойство цвета фона и то же самое делает элемент управления Grid, почему он задыхается при попытке установить с помощью триггера.

Большое спасибо за помощь в привязке этого типа для свойства из пользовательского элемента управления для обновления свойства в указанном c шаблоне элемента управления. Спасибо

1 Ответ

1 голос
/ 17 апреля 2020

Если вы использовали Grid.Triggers, вы должны установить TargetType="Grid" на вкладке Trigger, как показано ниже.

         <ControlTemplate x:Key="CT_MyTextboxEntry" >
            <!--having a grid as an outer wrapper for multiple internal controls...-->
            <Grid HorizontalOptions="StartAndExpand" x:Name="UpdateThisGridControl" IsEnabled="True" >
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="150*" />
                <ColumnDefinition Width="50" />
                <ColumnDefinition Width="16" />
            </Grid.ColumnDefinitions>


            <Entry Text="Sample" Grid.Column="0"  />
            <Label Text="junk" Grid.Column="1" />
            <Image Source="Sample.jpg" Grid.Column="2" />

 <!--For Testing, I set the value of `Property` is `IsEnabled`, it worked as normal  -->
                <Grid.Triggers>
                    <Trigger TargetType="Grid" Property="IsEnabled" Value="True">
                        <Setter Property="BackgroundColor" Value="Red"/>
                    </Trigger>
                </Grid.Triggers>


            </Grid>
        </ControlTemplate>

Но вы хотите установить TargetType="myCtrls:MyTextboxEntry" для Trigger,

Вы можете попытаться использовать Стиль , чтобы добиться этого для myCtrls:MyTextboxEntry.

    <ContentPage.Resources>

        <ResourceDictionary>
           <Style TargetType="myCtrls:MyTextboxEntry">
                <Style.Triggers>
                    <Trigger TargetType="myCtrls:MyTextboxEntry"
                         Property="IsRequired" Value="True">
                        <Setter Property="BackgroundColor" Value="Red" />

                        <!-- multiple Setters elements are allowed -->
                    </Trigger>
                </Style.Triggers>
            </Style>
        </ResourceDictionary>

        <ControlTemplate x:Key="CT_MyTextboxEntry" >
            <!--having a grid as an outer wrapper for multiple internal controls...-->
            <Grid HorizontalOptions="StartAndExpand" x:Name="UpdateThisGridControl"  >
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="150*" />
                <ColumnDefinition Width="50" />
                <ColumnDefinition Width="16" />
            </Grid.ColumnDefinitions>


            <Entry Text="Sample" Grid.Column="0"  />
            <Label Text="junk" Grid.Column="1" />
            <Image Source="Sample.jpg" Grid.Column="2" />


                <!--<Grid.Triggers>
                    <Trigger TargetType="Grid" Property="IsEnabled" Value="True">
                        <Setter Property="BackgroundColor" Value="Red"/>
                    </Trigger>
                </Grid.Triggers>-->


            </Grid>
        </ControlTemplate>
    </ContentPage.Resources>
    <StackLayout>

        <myCtrls:MyTextboxEntry ControlTemplate="{StaticResource CT_MyTextboxEntry}" IsRequired="True" />

    </StackLayout>

Вот скриншот.

enter image description here

...