将单选按钮绑定到单个 属性?
Bind RadioButtons to single property?
- 我的 RadioButton 很少,我不想绑定 "IsChecked"
属性 每一个在代码中都是唯一的 属性。
- 我想要一个像 "CurrentSelected" 这样的 属性 并根据
到那个设置 "IsChecked".
- 此外我不想使用转换器。
我尝试使用行为 "ChangePropertyAction" 但它看起来像
它仅以一种方式工作。这是我的代码:
<RadioButton
x:Name="UpRadioButton"
Margin="5"
Content="Up"
>
<i:Interaction.Triggers>
<ei:DataTrigger Binding="{Binding IsChecked, ElementName=UpRadioButton}" Value="True">
<ei:ChangePropertyAction TargetObject="{Binding Mode=OneWay}" PropertyName="SelectedDirection" Value="{x:Static Enums:DirectionEnum.Up}" />
</ei:DataTrigger>
</i:Interaction.Triggers>
</RadioButton>
<RadioButton
x:Name="DownRadioButton"
Margin="5"
Content="Down"
>
<i:Interaction.Triggers>
<ei:DataTrigger Binding="{Binding IsChecked, ElementName=DownRadioButton}" Value="True">
<ei:ChangePropertyAction TargetObject="{Binding Mode=OneWay}" PropertyName="SelectedDirection" Value="{x:Static Enums:DirectionEnum.Down}" />
</ei:DataTrigger>
</i:Interaction.Triggers>
</RadioButton>
<RadioButton
x:Name="LeftRadioButton"
Margin="5"
Content="Left"
>
<i:Interaction.Triggers>
<ei:DataTrigger Binding="{Binding IsChecked, ElementName=LeftRadioButton}" Value="True">
<ei:ChangePropertyAction TargetObject="{Binding Mode=OneWay}" PropertyName="SelectedDirection" Value="{x:Static Enums:DirectionEnum.Left}" />
</ei:DataTrigger>
</i:Interaction.Triggers>
</RadioButton>
<RadioButton
x:Name="RightRadioButton"
Margin="5"
Content="Right"
>
<i:Interaction.Triggers>
<ei:DataTrigger Binding="{Binding IsChecked, ElementName=RightRadioButton}" Value="True">
<ei:ChangePropertyAction TargetObject="{Binding Mode=OneWay}" PropertyName="SelectedDirection" Value="{x:Static Enums:DirectionEnum.Right}" />
</ei:DataTrigger>
</i:Interaction.Triggers>
</RadioButton>
我的视图模型很简单:MainViewModel.cs
public class MainViewModel : ViewModelBase
{
private DirectionEnum _selectedDirection;
public DirectionEnum SelectedDirection
{
get { return _selectedDirection; }
set
{
if (_selectedDirection != value)
{
_selectedDirection = value;
RaisePropertyChanged();
}
}
}
public MainViewModel()
{
SelectedDirection = DirectionEnum.Up;
}
}
正如您从代码中看到的那样,"Up" RadioButton 应该已经被选中了...
我错过了什么?
对我来说,一个常见的解决方案是使用包含选择行为的列表框,并覆盖模板以将项目绘制为单选按钮。
我的 XAML 模板通常如下所示:
<Style x:Key="RadioButtonListBoxStyle" TargetType="{x:Type ListBox}">
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="KeyboardNavigation.DirectionalNavigation" Value="Cycle" />
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="{x:Type ListBoxItem}" >
<Setter Property="Margin" Value="2, 2, 2, 0" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Border Background="Transparent">
<RadioButton
Content="{TemplateBinding ContentPresenter.Content}" VerticalAlignment="Center"
IsChecked="{Binding Path=IsSelected,RelativeSource={RelativeSource TemplatedParent},Mode=TwoWay}"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
</Style>
样式是这样应用的:
<ListBox ItemsSource="{Binding Directions}"
SelectedValue="{Binding SelectedDirection}"
Style="{StaticResource RadioButtonListBoxStyle}" />
我发现管理分组 RadioButton 的选择行为比在我的代码隐藏中维护大量 IsChecked 属性或使用转换器更简洁。
- 我的 RadioButton 很少,我不想绑定 "IsChecked" 属性 每一个在代码中都是唯一的 属性。
- 我想要一个像 "CurrentSelected" 这样的 属性 并根据 到那个设置 "IsChecked".
- 此外我不想使用转换器。
我尝试使用行为 "ChangePropertyAction" 但它看起来像 它仅以一种方式工作。这是我的代码:
<RadioButton x:Name="UpRadioButton" Margin="5" Content="Up" > <i:Interaction.Triggers> <ei:DataTrigger Binding="{Binding IsChecked, ElementName=UpRadioButton}" Value="True"> <ei:ChangePropertyAction TargetObject="{Binding Mode=OneWay}" PropertyName="SelectedDirection" Value="{x:Static Enums:DirectionEnum.Up}" /> </ei:DataTrigger> </i:Interaction.Triggers> </RadioButton> <RadioButton x:Name="DownRadioButton" Margin="5" Content="Down" > <i:Interaction.Triggers> <ei:DataTrigger Binding="{Binding IsChecked, ElementName=DownRadioButton}" Value="True"> <ei:ChangePropertyAction TargetObject="{Binding Mode=OneWay}" PropertyName="SelectedDirection" Value="{x:Static Enums:DirectionEnum.Down}" /> </ei:DataTrigger> </i:Interaction.Triggers> </RadioButton> <RadioButton x:Name="LeftRadioButton" Margin="5" Content="Left" > <i:Interaction.Triggers> <ei:DataTrigger Binding="{Binding IsChecked, ElementName=LeftRadioButton}" Value="True"> <ei:ChangePropertyAction TargetObject="{Binding Mode=OneWay}" PropertyName="SelectedDirection" Value="{x:Static Enums:DirectionEnum.Left}" /> </ei:DataTrigger> </i:Interaction.Triggers> </RadioButton> <RadioButton x:Name="RightRadioButton" Margin="5" Content="Right" > <i:Interaction.Triggers> <ei:DataTrigger Binding="{Binding IsChecked, ElementName=RightRadioButton}" Value="True"> <ei:ChangePropertyAction TargetObject="{Binding Mode=OneWay}" PropertyName="SelectedDirection" Value="{x:Static Enums:DirectionEnum.Right}" /> </ei:DataTrigger> </i:Interaction.Triggers> </RadioButton>
我的视图模型很简单:MainViewModel.cs
public class MainViewModel : ViewModelBase
{
private DirectionEnum _selectedDirection;
public DirectionEnum SelectedDirection
{
get { return _selectedDirection; }
set
{
if (_selectedDirection != value)
{
_selectedDirection = value;
RaisePropertyChanged();
}
}
}
public MainViewModel()
{
SelectedDirection = DirectionEnum.Up;
}
}
正如您从代码中看到的那样,"Up" RadioButton 应该已经被选中了... 我错过了什么?
对我来说,一个常见的解决方案是使用包含选择行为的列表框,并覆盖模板以将项目绘制为单选按钮。
我的 XAML 模板通常如下所示:
<Style x:Key="RadioButtonListBoxStyle" TargetType="{x:Type ListBox}">
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="KeyboardNavigation.DirectionalNavigation" Value="Cycle" />
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="{x:Type ListBoxItem}" >
<Setter Property="Margin" Value="2, 2, 2, 0" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Border Background="Transparent">
<RadioButton
Content="{TemplateBinding ContentPresenter.Content}" VerticalAlignment="Center"
IsChecked="{Binding Path=IsSelected,RelativeSource={RelativeSource TemplatedParent},Mode=TwoWay}"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
</Style>
样式是这样应用的:
<ListBox ItemsSource="{Binding Directions}"
SelectedValue="{Binding SelectedDirection}"
Style="{StaticResource RadioButtonListBoxStyle}" />
我发现管理分组 RadioButton 的选择行为比在我的代码隐藏中维护大量 IsChecked 属性或使用转换器更简洁。