2010-02-06 2 views
1

J'ai un comboBox qui a les éléments suivants: a1, a2, a3, a4 et j'ai deux boutons radio r1 et r2. Voici ce que je veux accomplir: si l'utilisateur sélectionne l'élément a2 de la liste déroulante, la propriété IsChecked de r1 doit être définie sur true. Si l'utilisateur sélectionne l'élément a3 ou a4 de la liste déroulante, la propriété IsChecked de r2 doit être définie sur true. Je voudrais accomplir ceci de façon déclarative; c'est-à-dire sans utiliser de convertisseur. Voici mon code et merci à l'avance:Comment faire pour définir la propriété IsChecked d'un RadioButton à partir du contenu d'un ComboBox de manière déclarative?

<Window x:Class="BMSystem.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <Window.Resources> 
     <Style x:Key="myRadioActivator1"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=Content, ElementName=comboBox1}" Value="R2"> 
        <Setter Property="RadioButton.IsChecked" Value="True"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
     <Style x:Key="myRadioActivator2"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=Content, ElementName=comboBox1}" Value="R3"> 
        <Setter Property="RadioButton.IsChecked" Value="True"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Path=Content, ElementName=comboBox1}" Value="R4"> 
        <Setter Property="RadioButton.IsChecked" Value="True"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Window.Resources> 
    <Grid> 
     <ComboBox Height="23" HorizontalAlignment="Left" Margin="10,10,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120" SelectionChanged="comboBox1_SelectionChanged"> 
      <ComboBoxItem>R1</ComboBoxItem> 
      <ComboBoxItem>R2</ComboBoxItem> 
      <ComboBoxItem>R3</ComboBoxItem> 
      <ComboBoxItem>R4</ComboBoxItem> 
     </ComboBox> 
     <RadioButton Height="16" HorizontalAlignment="Left" Margin="10,43,0,0" Name="r1" VerticalAlignment="Top" Width="120" Style="{StaticResource myRadioActivator1}"> 
     </RadioButton> 
     <RadioButton Height="16" HorizontalAlignment="Left" Margin="10,69,0,0" Name="r2" VerticalAlignment="Top" Width="120" Style="{StaticResource myRadioActivator2}"> 
     </RadioButton> 
    </Grid> 
</Window> 
+0

Pouvez-vous publier le gestionnaire 'comboBox1_SelectionChanged' aussi s'il vous plaît. – ChrisF

Répondre

1

Je pense que votre objectif de faire cela sans un convertisseur est bon, mais votre objectif de le faire entièrement déclarative est discutable. J'ajouterai une propriété IsChecked au modèle de vue des articles de ComboBox et lier à lui. Pour moi, placer le processus de prise de décision qui sous-tend l'établissement de cette propriété semble troubler la séparation des préoccupations.

0

Man ... ce sont des exigences bizarres!

Voici une solution:

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Page.Resources> 
    <XmlDataProvider x:Key="CBOptions"> 
     <x:XData> 
     <Data xmlns=""> 
      <Option Name="R1" /> 
      <Option Name="R2" IsR1Checked="True" /> 
      <Option Name="R3" IsR2Checked="True" /> 
      <Option Name="R4" IsR2Checked="True" /> 
     </Data> 
     </x:XData> 
    </XmlDataProvider> 
    <DataTemplate x:Key="CBItemTemplate"> 
     <TextBlock Text="{Binding [email protected]}" /> 
    </DataTemplate> 
    </Page.Resources> 
    <Grid DataContext="{Binding ElementName=comboBox1, Path=SelectedItem}"> 
    <ComboBox Height="23" HorizontalAlignment="Left" Margin="10,10,0,0" Name="comboBox1" 
     VerticalAlignment="Top" Width="120" IsSynchronizedWithCurrentItem="True" 
     ItemsSource="{Binding Source={StaticResource CBOptions}, XPath=Data/Option}" 
     ItemTemplate="{StaticResource CBItemTemplate}" /> 
    <RadioButton Height="16" HorizontalAlignment="Left" Margin="10,43,0,0" 
     Name="r1" VerticalAlignment="Top" Width="120" GroupName="R1" 
     IsChecked="{Binding [email protected]}" /> 
    <RadioButton Height="16" HorizontalAlignment="Left" Margin="10,69,0,0" 
     Name="r2" VerticalAlignment="Top" Width="120" GroupName="R2" 
     IsChecked="{Binding [email protected]}" /> 
    </Grid> 
</Page> 
0

Vous pouvez le faire en déplaçant tout en DataTemplate et en utilisant Trigger s là. Je considérerais probablement la suggestion de Robert que cela soit corrigé dans un ViewModel ou un autre objet lié parce que cela ressemble plus à une logique métier qu'à une interface utilisateur. Cela dit:

<ContentControl Content="{Binding}"> 
    <ContentControl.ContentTemplate> 
     <DataTemplate> 
      <Grid> 
       <ComboBox Height="23" HorizontalAlignment="Left" Margin="10,10,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120" SelectionChanged="comboBox1_SelectionChanged" 
          SelectedValuePath="Content"> 
        <ComboBoxItem>R1</ComboBoxItem> 
        <ComboBoxItem>R2</ComboBoxItem> 
        <ComboBoxItem>R3</ComboBoxItem> 
        <ComboBoxItem>R4</ComboBoxItem> 
       </ComboBox> 
       <RadioButton Height="16" HorizontalAlignment="Left" Margin="10,43,0,0" Name="r1" VerticalAlignment="Top" Width="120" > 
       </RadioButton> 
       <RadioButton Height="16" HorizontalAlignment="Left" Margin="10,69,0,0" Name="r2" VerticalAlignment="Top" Width="120" > 
       </RadioButton> 
      </Grid> 
      <DataTemplate.Triggers> 
       <Trigger SourceName="comboBox1" Property="SelectedValue" Value="R2"> 
        <Setter TargetName="r1" Property="RadioButton.IsChecked" Value="True"/> 
       </Trigger> 
       <Trigger SourceName="comboBox1" Property="SelectedValue" Value="R3"> 
        <Setter TargetName="r2" Property="RadioButton.IsChecked" Value="True"/> 
       </Trigger> 
       <Trigger SourceName="comboBox1" Property="SelectedValue" Value="R4"> 
        <Setter TargetName="r2" Property="RadioButton.IsChecked" Value="True"/> 
       </Trigger> 
      </DataTemplate.Triggers> 
     </DataTemplate> 
    </ContentControl.ContentTemplate> 
</ContentControl> 
Questions connexes