与行为结合到单一的财产单选按钮 [英] RadioButtons with behavior bind to single property

查看:152
本文介绍了与行为结合到单一的财产单选按钮的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


  • 我有几个单选按钮,我不想要绑定器isChecked他们每个人的
    属性代码中的独特属性。

  • 我希望有一个单一的财产,如CurrentSelected,并根据
    到设置了器isChecked。

  • 在另外我不想使用转换器。

  • 我试图用行为ChangePropertyAction但它看起来像
    它以一种方式工作而已。这里是我的代码:

  • I'm having few RadioButtons and I don't want to bind "IsChecked" property of each one of them to unique property in the code.
  • I want to have a single property like "CurrentSelected" and according to that to set the "IsChecked".
  • In addition I don't want to use converters.
  • I tried to use the behavior "ChangePropertyAction" but it looks like it's working only in one way. here is my code:

<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

my view model is very simple: 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;            
    }  
}



你可以从代码,上看到单选按钮应已签...
我在想什么?

as you can see from the code, the "Up" RadioButton should be already checked... What am I missing ?

推荐答案

对于我来说一个常见的​​解决方案是使用一个列表框,其中包含选择行为,并覆盖模板绘制的项目,如单选按钮。而不是

A common solution for me is to use a ListBox, which contains Selection behavior, and overwrite the Template to draw items as RadioButtons instead.

我的XAML模板通常看起来是这样的:

My XAML template usually looks something like this :

<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>



该样式应用这样的:

The style is applied like this:

<ListBox ItemsSource="{Binding Directions}"
         SelectedValue="{Binding SelectedDirection}"
         Style="{StaticResource RadioButtonListBoxStyle}" />



我觉得这么多的管理分组单选按钮的选择行为不是在维护大量器isChecked物业清洁我代码隐藏,或使用转换器。

I find this much cleaner for managing selection behavior of grouped RadioButtons than maintaining a lot of IsChecked properties in my code-behind, or using converters.

这篇关于与行为结合到单一的财产单选按钮的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆