You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WPF样式中将RadioButton的Content绑定到TextBlock的Text?

WPF RadioButton样式中Content绑定失效的解决方法

问题原因

你当前的写法错误地在ContentPresenter内部直接定义了StackPanel作为子元素,这会覆盖ContentPresenter原本用于显示RadioButtonContent的逻辑。同时TextBlock的TemplateBinding上下文是ContentPresenter而非外层的RadioButton,导致无法正确获取目标属性值。

解决方案

提供两种可行的修改方式:

方式一:使用ContentPresenter的ContentTemplate

将硬编码的StackPanel改为ContentPresenter的ContentTemplate,让ContentPresenter自动把RadioButton的Content作为DataContext传递给模板内的元素:

<Style x:Key="UserRadioButton" TargetType="RadioButton">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="RadioButton">
                <Grid>
                    <Border
                        x:Name="border"
                        Background="Transparent"
                        BorderBrush="Black"
                        BorderThickness="2"
                        CornerRadius="5">
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center">
                            <ContentPresenter.ContentTemplate>
                                <DataTemplate>
                                    <StackPanel>
                                        <fa:IconImage MaxHeight="50" Icon="User" />
                                        <TextBlock
                                            Width="Auto"
                                            Height="Auto"
                                            FontSize="16"
                                            Text="{Binding}" />
                                    </StackPanel>
                                </DataTemplate>
                            </ContentPresenter.ContentTemplate>
                        </ContentPresenter>
                    </Border>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsChecked" Value="True">
                        <Setter TargetName="border" Property="Background" Value="LightBlue" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

方式二:直接绑定到TemplatedParent

去掉多余的ContentPresenter,直接在Border内放置StackPanel,通过RelativeSource绑定到RadioButton的Content属性:

<Style x:Key="UserRadioButton" TargetType="RadioButton">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="RadioButton">
                <Grid>
                    <Border
                        x:Name="border"
                        Background="Transparent"
                        BorderBrush="Black"
                        BorderThickness="2"
                        CornerRadius="5">
                        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
                            <fa:IconImage MaxHeight="50" Icon="User" />
                            <TextBlock
                                Width="Auto"
                                Height="Auto"
                                FontSize="16"
                                Text="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}" />
                        </StackPanel>
                    </Border>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsChecked" Value="True">
                        <Setter TargetName="border" Property="Background" Value="LightBlue" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

说明

两种方式都能解决绑定失效的问题:

  • 方式一更符合WPF控件模板的设计规范,保留了ContentPresenter的灵活性,后续若需要动态替换内容模板也更方便。
  • 方式二更简洁,适合固定布局的场景,直接跳过ContentPresenter减少了一层视觉树节点。

内容的提问来源于stack exchange,提问作者Alexandro Cardona

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 14:18:31