首页 > 解决方案 > 首次绘制控件后,Xamarin.Forms ControlTemplate 绑定失败

问题描述

我有一个ControlTemplate修改 Xamarin.Forms 中单选按钮的外观。
我从https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/radiobutton#redefine-radiobutton-appearance借用/更新了它

它看起来很棒,并且在创建页面时外观很完美。
我希望单选按钮中的图像根据绑定进行更改,但它不会这样做。
绑定属性被修改,OnPropertyChanged()被调用,但绑定没有被触发。

这是一般外观(其中两个RadioButton并排)

在此处输入图像描述

同样,外观和Converter一切都可以正常工作,但仅在第一次绘制页面时。

这是控制模板

<ControlTemplate x:Key="RadioButtonTemplate">
    <Frame 
               BackgroundColor="#30888888"
               HasShadow="False"
               HeightRequest="{TemplateBinding HeightRequest}"
               WidthRequest="{TemplateBinding WidthRequest}"
               HorizontalOptions="Start"
               VerticalOptions="StartAndExpand"
               Padding="0">
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroupList>
                <VisualStateGroup x:Name="CheckedStates">
                    <VisualState x:Name="Checked">
                        <VisualState.Setters>
                            <Setter Property="BorderColor" Value="Accent" />
                            <Setter TargetName="check"
                                        Property="Opacity"
                                        Value="1" />
                            <Setter TargetName="checkrim"
                                        Property="Opacity"
                                        Value="1" />
                        </VisualState.Setters>
                    </VisualState>
                    <VisualState x:Name="Unchecked">
                        <VisualState.Setters>
                            <Setter Property="BackgroundColor" Value="{DynamicResource TransparentBackgroundColour}" />
                            <Setter Property="BorderColor" Value="Transparent" />
                            <Setter TargetName="check"
                                        Property="Opacity"
                                        Value="0" />
                            <Setter TargetName="checkrim"
                                        Property="Opacity"
                                        Value="0" />
                        </VisualState.Setters>
                    </VisualState>
                </VisualStateGroup>
            </VisualStateGroupList>
        </VisualStateManager.VisualStateGroups>
        <Grid Margin="4"
                WidthRequest="100">
            <ContentPresenter Margin="6" />

            <Grid WidthRequest="20"
               HeightRequest="20"
                    Padding="0"
               HorizontalOptions="Start"
               VerticalOptions="Start">

                <Ellipse x:Name="unckecd"
                            Stroke="White"
                            StrokeThickness="2"
                            Fill="Transparent"
                            Margin="0"
                            WidthRequest="20" HeightRequest="20"
                            HorizontalOptions="Center" VerticalOptions="Center" />

                <Ellipse x:Name="checkrim"
                            Stroke="Accent"
                            StrokeThickness="2"
                            Fill="Transparent"
                            Margin="0"
                            WidthRequest="20" HeightRequest="20"
                            HorizontalOptions="Center" VerticalOptions="Center" />

                <Ellipse x:Name="check"
                            Fill="Accent"
                            Margin="1,1,0,0"
                            WidthRequest="10" HeightRequest="10"
                            HorizontalOptions="Center" VerticalOptions="Center" />
            </Grid>
        </Grid>
    </Frame>
</ControlTemplate>

Style我的RadioButton

<Style x:Key="FancyRadioButton" TargetType="RadioButton">
    <Setter Property="ControlTemplate"
        Value="{DynamicResource RadioButtonTemplate}" />
</Style>

和我的RadioButton

<RadioButton Style="{StaticResource FancyRadioButton}"
                Value="{x:Static gdl90Types:UdpTransmitMode.UdpUnicast}"
                WidthRequest="150"
                HeightRequest="103">

<RadioButton.Content>
    <StackLayout VerticalOptions="Start" Spacing="0" Margin="0, -3">                                            
        <Image Source="{Binding Source=ColourPresetSetting, 
                            ConverterParameter=unicast,
                            Converter={StaticResource ResourceImageFromThemeConverter}}"
                    Margin="22,0"
                    Aspect="AspectFit"
                    />              
        <Label Text="UDP UNICAST" TextColor="{DynamicResource MediumContrastTextColour}" />
    </StackLayout>
</RadioButton.Content>

我想要的只是Image通知RadioButton属性ColourPresetSetting变化,更新图像。
它在第一次绘制时会这样做,但之后就不会了。

我错过了一些明显的东西吗?

标签: xamlxamarinxamarin.formsdata-binding

解决方案


推荐阅读