元素不采用回退值(对于样式属性)



我遇到了用户控制开发的问题。

用户控件公开几个 DP(样式类型)。用户控件的元素将其样式属性绑定到它们。为了在样式不是由用户定义时显示某些内容,UserControl 为这些绑定提供回退值(在 UserControl.Resources 部分中定义的样式)。问题是用户控件的元素中只有一个采用回退值,而其他元素则不采用。似乎有些东西只是覆盖了回退值。此外,VS 设计器正常显示用户控件本身(我的意思是,似乎正确使用了 FallbackValues)。但是,当用户控件驻留在另一个用户控件或窗口中时,我会看到之前描述的行为。

下面是用户控件的 xaml:

<UserControl
Background="White" Style="{Binding UserControlStyle}"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<UserControl.Resources>      
    <LinearGradientBrush x:Key="GeneralKeyBackground" StartPoint="0.5,0" EndPoint="0.5,1">
        <GradientStop Offset="0" Color="#FFA0A9B2" />
        <GradientStop Offset="1" Color="#FF5B626A" />            
    </LinearGradientBrush>
    <LinearGradientBrush x:Key="StationNameBackground" StartPoint="0.5,0" EndPoint="0.5,1">
        <GradientStop Offset="0" Color="#FFC4E3FF" />
        <GradientStop Offset="0.462" Color="#FFE7F3FF" />
    </LinearGradientBrush>
    <Style x:Key="DefaultStationNameForSearchingStyle" TargetType="TextBox">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid>
                        <TextBox TextAlignment="Center" Text="{TemplateBinding Text}" 
                                 Background="Transparent" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="FontSize" Value="22" />
        <Setter Property="Foreground" Value="Black" />
    </Style>
    <Style x:Key="DefaultButtonsStyle" TargetType="customControls:RoundButton">
        <Setter Property="Template" Value="{DynamicResource RoundButtonTemplate}" />
        <Setter Property="Width" Value="85" />
        <Setter Property="Height" Value="75" />          
        <Setter Property="FontFamily" Value="Verdana" />
        <Setter Property="FontSize" Value="22" />
        <Setter Property="Background" Value="{StaticResource GeneralKeyBackground}" />
        <Setter Property="Foreground" Value="White" />
        <Style.Triggers>
            <Trigger Property="IsEnabled" Value="false">
                <Setter Property="Foreground" Value="Gray" />
            </Trigger>
        </Style.Triggers>
    </Style>
    <DataTemplate x:Key="StationTemplate">
        <customControls:RoundButton MinWidth="350" MinHeight="60" DataContext="{Binding}" Content="{Binding }" />
    </DataTemplate>
    <Style x:Key="DefaultTitleStyle" TargetType="TextBlock">
        <Setter Property="Control.FontSize" Value="48" />        
        <Setter Property="Control.Foreground" Value="Black" />
    </Style>       
    <Style x:Key="DefaultStationNameForSearchingBorderStyle" TargetType="Border">           
        <Setter Property="BorderBrush" Value="#FF2C8BF5" />
        <Setter Property="Background" Value="{StaticResource StationNameBackground}" />
    </Style>
    <!-- EndRegion -->
</UserControl.Resources>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <TextBlock Text="Select Station"
               Style="{Binding TitleStyle, FallbackValue={StaticResource DefaultTitleStyle}}" />
    <userControls:ScrollableWrapPanel x:Name="StationsPanel" Grid.Row="1"  ItemsSource="{Binding FilteredStations}"
                                      ItemTemplate="{StaticResource StationTemplate}"
                                      ButtonsStyle="{StaticResource DefaultButtonsStyle}" />
    <Border Grid.Row="2" MinWidth="460" MinHeight="65"
            Style="{Binding StationNameForSearchingBorderStyle, FallbackValue={StaticResource DefaultStationNameForSearchingBorderStyle}}">
        <TextBox x:Name="StationName" Width="420" Height="55" SelectionChanged="TextBoxBase_OnSelectionChanged"
                 Style="{Binding StationNameForSearchingStyle, FallbackValue={StaticResource DefaultStationNameForSearchingStyle}}" />
    </Border>
    <Border Grid.Row="3" Style="{Binding KeyboardBorderStyle}">
        <virtualKeyboard:VirtualKeyboard x:Name="VirtualKeyboard" 
                         GeneralKeyStyle="{Binding KeyboardButtonsStyle, FallbackValue={StaticResource DefaultButtonsStyle}}"/>
    </Border>
</Grid>

虚拟键盘按钮始终采用回退值,它只是工作。其他人则不是。您有什么建议来调试这种非常奇怪的行为?

BindingBase.FallbackValue 的文档状态

在以下情况下,绑定将成功返回值:

  1. 绑定源的路径已成功解析。
  2. 转换器(如果有)能够转换结果值。
  3. 结果值对绑定目标(目标)属性有效。

如果 1 和 2 返回 DependencyProperty.UnsetValue,则目标属性将设置为 FallbackValue 的值(如果可用)。

因此,如果设置任何依赖项属性或返回 [null] 值,则会将其视为有效绑定,并且不会使用回退值。

我不知道这是否是您的问题,因为我需要看到更多您的解决方案,但值得检查。

我希望这有所帮助。

就像@EngineerSpock上面的评论中所说的那样,改用TargetNullValue

最新更新