C#WPF:对DataTrigger使用RadioButton IsChecked属性

时间:2017-12-29 16:52:40

标签: c# wpf xaml

在我的应用程序中,特定TextBlock中的文本取决于检查两个RadioButton中的哪一个。下面是xaml的一个例子:

<Window x:Class="UTScanForm.Support.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:UTScanForm.Support"
        mc:Ignorable="d"
        Title="Window1" Height="300" Width="300">
    <Grid>
        <StackPanel>
            <RadioButton x:Name="RB1" Content="RB1"/>
            <RadioButton x:Name="RB2" Content="RB2"/>
            <TextBlock Text="none">
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding IsChecked, ElementName=RB1}" Value="True">
                                <Setter Property="Text" Value="RB1"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding IsChecked, ElementName=RB2}" Value="True">
                                <Setter Property="Text" Value="RB2"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
        </StackPanel>
    </Grid>
</Window>

如上面的代码所示,有两个单选按钮,RB1RB2。如果选中RB1,则文本块中的文本应为RB1,否则为RB2。但是,代码不起作用。你能否指出我做了什么错误以及正确的解决方案是什么?

1 个答案:

答案 0 :(得分:2)

这是由于dependency property value precedence。 TextBlock上的Text="none"属性会覆盖样式所做的任何事情。这是一个功能,而不是错误:它允许您使用多个控件上使用的样式设置默认值,然后为特定实例覆盖它们。

修复很简单:使用样式设置器设置默认的“无”文本,其他样式设置器可以覆盖它。

<TextBlock>
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Setter Property="Text" Value="none" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsChecked, ElementName=RB1}" Value="True">
                    <Setter Property="Text" Value="RB1"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding IsChecked, ElementName=RB2}" Value="True">
                    <Setter Property="Text" Value="RB2"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

顺便说一下,这不适用于DataTemplate或ControlTemplate触发器。他们可以覆盖属性。