Useful to bind multiple RadioButton / ToogleButton on 1 enum property.
|
<ListBox SelectedIndex="{Binding Mode, Mode=TwoWay, Converter={StaticResource EnumToNumberConverter}}"
Style="{StaticResource HorizontalRadioButtonList}">
<ListBoxItem Content="Mode 1" />
<ListBoxItem Content="Mode 2" />
<ListBoxItem Content="Mode 3" />
</ListBox>
|
|
public Mode Mode
{
get => mode;
set => SetProperty(ref mode, value);
}
enum Mode
{
Mode1,
Mode2,
Mode3
}
|
|
<Style x:Key="RadioButtonHorizontalListBox"
TargetType="ListBox">
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBox}">
<Border BorderThickness="1,0,0,0"
BorderBrush="{TemplateBinding BorderBrush}">
<ItemsPresenter />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="ListBoxItem">
<!-- to get the same brush as the ListBox -->
<Setter Property="BorderBrush"
Value="{Binding BorderBrush, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBox, AncestorLevel=1}}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<!-- RadioButton -->
<DockPanel Background="{TemplateBinding Background}">
<RadioButton IsChecked="{TemplateBinding IsSelected}"
Focusable="False"
IsHitTestVisible="False"
VerticalAlignment="Center"
Margin="0,0,4,0" />
<ContentPresenter Content="{TemplateBinding ContentControl.Content}"
ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"
ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}"
HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}"
SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
</DockPanel>
<!-- ToggleButton -->
<Grid Background="{TemplateBinding Background}">
<ToggleButton IsChecked="{TemplateBinding IsSelected}"
Content="{TemplateBinding Content}"
Padding="10,5"
BorderThickness="0,1,1,1"
BorderBrush="{TemplateBinding BorderBrush}"
Focusable="False"
IsHitTestVisible="False" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
</Style>
|
|
// binding from Int to Enum need a converter
[ValueConversion(typeof(Enum), typeof(int))]
public sealed class EnumToNumberConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null || targetType == null)
{
return DependencyProperty.UnsetValue;
}
return value.GetType().IsEnum
? System.Convert.ChangeType(value, Enum.GetUnderlyingType(value.GetType()), culture)
: DependencyProperty.UnsetValue;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null || targetType == null)
{
return DependencyProperty.UnsetValue;
}
return targetType.IsEnum ? Enum.ToObject(targetType, value) : DependencyProperty.UnsetValue;
}
}
|