选中项目时,单选按钮不显示子弹
本文关键字:显示 子弹 单选按钮 项目 | 更新日期: 2023-09-27 18:17:06
我的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" />
我也有以下自定义样式的RadioButtons
在我的App.xaml:
<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
value为Enum类型,parameter为string类型。
对象。Equals比较引用,除非在派生类中被重写,并提供自定义比较器。所以,在你的情况下enum和string显然是不同的引用,总是计算为false。因此,单选按钮从不被检查。
你可以这样做相等性检查:
value.ToString().Equals( parameter );
这将工作,因为string override Equals方法来比较值。因此,如果内容相同,则计算结果为真
改变:
public object Convert( object value, Type targetType, object parameter,
CultureInfo culture ) {
return value == null ? Binding.DoNothing :
value.ToString().Equals( parameter );
}