我遇到了用户控制开发的问题。
用户控件公开几个 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 返回 DependencyProperty.UnsetValue,则目标属性将设置为 FallbackValue 的值(如果可用)。
因此,如果设置任何依赖项属性或返回 [null] 值,则会将其视为有效绑定,并且不会使用回退值。
我不知道这是否是您的问题,因为我需要看到更多您的解决方案,但值得检查。
我希望这有所帮助。
就像@EngineerSpock上面的评论中所说的那样,改用TargetNullValue
。