« RadioButton » : différence entre les versions
De Banane Atomic
Aller à la navigationAller à la recherche
(9 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
[[Category:WPF]] | [[Category:WPF]] | ||
= [[ListBoxEdit#Style_RadioButton|DevExpress ListBoxEdit avec un style RadioButton]] = | = [[ListBoxEdit#Style_RadioButton|DevExpress ListBoxEdit avec un style RadioButton]] = | ||
= [http://stackoverflow.com/questions/1317891/simple-wpf-radiobutton-binding ListBox | |||
= [http://stackoverflow.com/questions/1317891/simple-wpf-radiobutton-binding ListBox with RadioButton / ToogleButton item style] = | |||
Useful to bind multiple RadioButton / ToogleButton on 1 enum property. | |||
<kode lang='xaml'> | <kode lang='xaml'> | ||
<ListBox | <ListBox SelectedIndex="{Binding Mode, Mode=TwoWay, Converter={StaticResource EnumToNumberConverter}}" | ||
<ListBoxItem> | Style="{StaticResource HorizontalRadioButtonList}"> | ||
<ListBoxItem | <ListBoxItem Content="Mode 1" /> | ||
<ListBoxItem Content="Mode 2" /> | |||
<ListBoxItem Content="Mode 3" /> | |||
</ListBox> | </ListBox> | ||
</kode> | </kode> | ||
<kode lang=' | <kode lang='cs'> | ||
public Mode Mode | |||
{ | |||
get => mode; | |||
set => SetProperty(ref mode, value); | |||
} | |||
enum Mode | |||
< | { | ||
Mode1, | |||
Mode2, | |||
Mode3 | |||
} | |||
</kode> | |||
<Setter Property=" | <kode lang='xaml' collapsed> | ||
<Style x:Key="RadioButtonHorizontalListBox" | |||
TargetType="ListBox"> | |||
<Setter Property="ItemsPanel"> | |||
<Setter.Value> | |||
<ItemsPanelTemplate> | |||
<VirtualizingStackPanel Orientation="Horizontal" /> | |||
</ItemsPanelTemplate> | |||
</Setter.Value> | |||
</Setter> | |||
<Setter Property=" | <Setter Property="Template"> | ||
<Setter.Value> | <Setter.Value> | ||
<ControlTemplate TargetType="{x:Type ListBox}"> | <ControlTemplate TargetType="{x:Type ListBox}"> | ||
< | <Border BorderThickness="1,0,0,0" | ||
BorderBrush="{TemplateBinding BorderBrush}"> | |||
<ItemsPresenter /> | |||
</Border> | |||
</ControlTemplate> | </ControlTemplate> | ||
</Setter.Value> | </Setter.Value> | ||
</Setter> | </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.Value> | ||
</Setter> | </Setter> | ||
Ligne 49 : | Ligne 96 : | ||
</kode> | </kode> | ||
<kode lang=' | <kode lang='cs'> | ||
// 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; | |||
} | |||
} | |||
</kode> | </kode> |
Dernière version du 30 mai 2022 à 16:38
DevExpress ListBoxEdit avec un style RadioButton
ListBox with RadioButton / ToogleButton item style
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; } } |