如何将控件Foreground属性绑定到其他控件,解决ListView选中时HyperlinkButton前景色不更新问题
问题原因
HyperlinkButton自带的默认样式硬编码了不同状态下的Foreground属性值,打断了从父级ListViewItem的Foreground属性继承链路,所以即使ListViewItem选中时自身Foreground变为白色,也无法传递到HyperlinkButton内部的文本上。你之前绑定同模板内其他TextBlock的Foreground不生效,是因为普通TextBlock的Foreground是继承自父级ListViewItem,而绑定的是依赖属性的本地值,继承变更不会触发绑定更新。
解决方案1:单行代码修复(推荐)
直接将HyperlinkButton内部TextBlock的Foreground绑定到当前项的父容器ListViewItem的Foreground属性即可,无需额外样式修改:
<HyperlinkButton VerticalAlignment="Center" HorizontalAlignment="Center" Click="HyperlinkButton_Click" FontSize="12" Grid.Row="1" Grid.Column="2"> <TextBlock Opacity="1" Foreground="{Binding Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem}, Mode=OneWay}" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="12" Text="{Binding EmailInfo}"/> </HyperlinkButton>
RelativeSource会自动向上查找当前数据模板所属的ListViewItem容器,直接绑定它的Foreground属性,ListViewItem选中时属性变更会同步到绑定目标,完全符合系统默认交互逻辑。
解决方案2:全局修改HyperlinkButton样式(适合多处使用场景)
如果你项目中多处用到ListView内嵌HyperlinkButton的场景,可以直接重写HyperlinkButton的默认样式,让它所有状态下的Foreground都继承父级属性,一次修改全局生效:
<!-- 放在页面资源或者App.xaml资源字典中 --> <Style TargetType="HyperlinkButton" x:Key="ListViewCompatibleHyperlinkButton"> <Setter Property="Foreground" Value="{Binding Foreground, RelativeSource={RelativeSource Mode=TemplatedParent}}"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="HyperlinkButton"> <ContentPresenter x:Name="ContentPresenter" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" Foreground="{TemplateBinding Foreground}" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> <ControlTemplate.Triggers> <Trigger Property="IsPointerOver" Value="True"> <!-- 可以根据需求调整悬浮态颜色,这里示例用半透效果,也可直接绑定父级Foreground加色值转换 --> <Setter TargetName="ContentPresenter" Property="Foreground" Value="#80FFFFFF"/> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter TargetName="ContentPresenter" Property="Foreground" Value="#B3FFFFFF"/> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter TargetName="ContentPresenter" Property="Opacity" Value="0.5"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>
使用时只需要给HyperlinkButton指定样式即可:
<HyperlinkButton Style="{StaticResource ListViewCompatibleHyperlinkButton}" .../>
内容的提问来源于stack exchange,提问作者Eugen M
相关产品推荐
相关产品推荐

