繁体   English   中英

检查项目时,RadioButton不显示项目符号

[英]RadioButton not displaying bullet when item is checked

我的WPF对话框中有几个RadioButtons

<RadioButton Content="Mode 1"
             Grid.Column="1"
             GroupName="Modes"
             IsChecked="{Binding Converter={StaticResource ModeConverter}, ConverterParameter=Mode1, Path=Mode}"
             Margin="5"
             TabIndex="8"
             VerticalAlignment="Center" />
<RadioButton Content="Mode 2"
             Grid.Column="3"
             GroupName="Modes"
             IsChecked="{Binding Converter={StaticResource ModeConverter}, ConverterParameter=Mode2, Path=Mode}"
             Margin="5"
             TabIndex="8"
             VerticalAlignment="Center" />

我的App.xaml中还具有以下用于RadioButtons自定义样式:

<Style TargetType="{x:Type RadioButton}">
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" />
    <Setter Property="Background" Value="#F4F4F4" />
    <Setter Property="BorderBrush" Value="{StaticResource CheckBoxStroke}" />
    <Setter Property="BorderThickness" Value="1" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type RadioButton}">
                <BulletDecorator Background="Transparent">
                    <BulletDecorator.Bullet>
                        <Themes:BulletChrome BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" IsChecked="{TemplateBinding IsChecked}" IsRound="true" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}" Width="{TemplateBinding FontSize}" Height="{TemplateBinding FontSize}" />
                    </BulletDecorator.Bullet>
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                </BulletDecorator>
                <ControlTemplate.Triggers>
                    <Trigger Property="HasContent" Value="true">
                        <Setter Property="FocusVisualStyle" Value="{StaticResource CheckRadioFocusVisual}" />
                        <Setter Property="Padding" Value="10,0,0,0" />
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

为了完整起见,这是我在IsChecked绑定中使用的IValueConverter的代码:

[ValueConversion( typeof( Enum ), typeof( bool ))]
public class EnumToBooleanConverter : IValueConverter {

    public object Convert( object value, Type targetType, object parameter, CultureInfo culture ) {
        return value == null ? Binding.DoNothing : value.Equals( parameter );
    }

    public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture ) {
        return value.Equals( true ) ? parameter : Binding.DoNothing;
    }
}

RadioButtons按我的意愿进行渲染,但是即使设置了视图模型对象中它们后面的属性,也没有检查任何内容。 单击其中一个按钮可以更改属性的值,但它们仍未显示为选中状态。

有人对我在做什么错有任何想法吗?

问题出在您要检查是否相等的转换器中:

value.Equals( parameter ); <-- HERE

值是Enum类型,参数是字符串类型。

除非在派生类中重写,否则Object.Equals比较引用,并提供自定义比较器。 因此,在您的情况下, 枚举和字符串显然是不同的引用,它们总是被评估为假。 因此,从不检查单选按钮。

您可以像这样进行相等性检查:

value.ToString().Equals( parameter );

这将起作用,因为字符串将覆盖Equals方法以比较值。 因此,如果内容相同,它将被评估为真实。


更改:

public object Convert( object value, Type targetType, object parameter,
                       CultureInfo culture ) {
    return value == null ? Binding.DoNothing :
                           value.ToString().Equals( parameter );
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM