2015-02-17 2 views
2
  • У меня немного RadioButtons, и я не хочу связывать свойство IsChecked каждого из них с уникальным свойством в коде.
  • Я хочу иметь одно свойство типа «CurrentSelected» и в соответствии с , чтобы установить «IsChecked».
  • Кроме того, я не хочу использовать преобразователи.
  • Я попытался использовать поведение «ChangePropertyAction», но он выглядит как , он работает только в одном направлении. Вот мой код:RadioButtons с поведением привязаны к одному свойству

    <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 должен быть уже проверен ... Что мне не хватает?

+1

Он может работать только один раз, так как ваши привязки - это только один способ ... Кроме того, что случилось с преобразователями? Есть один, который * отлично * для этого – BradleyDotNET

+0

конвертерам требуется обслуживание ... – kaycee

+0

Так что вообще код ... Его выбор, но, говоря, что вам не нравятся конвертеры, потому что они требуют «обслуживания», это довольно плохая причина/извините в моей книге. – BradleyDotNET

ответ

7

Общепринятое решение для меня - использовать ListBox, который содержит поведение выбора, и перезаписать шаблон для рисования элементов в качестве RadioButtons.

Мой шаблон 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}" /> 

я нахожу это гораздо чище для управления поведением выбора сгруппированных Radiobuttons, чем поддержание много свойств IsChecked в моем коде, или с помощью конвертеров.

+0

Рэйчел, ваше решение более чем идеально. благодаря – kaycee

 Смежные вопросы

  • Нет связанных вопросов^_^