2011-07-15 6 views
2

Je le bouton radio suivant lié à la variable IsAllowedliaison à un bouton radio

<RadioButton Name="YesRadioButton" Margin="5,5,0,0" IsChecked="{Binding Path=IsAllowed, Mode=TwoWay}">Yes</RadioButton> 

Comment puis-je faire le bouton Non pour prendre la valeur opposée uniquement à l'aide XAML?

Répondre

3

Il n'y a pas de solution Xaml uniquement. Vous pouvez lier non en utilisant un convertisseur bool inverse.

<local:NotConverter x:Key="notConverter"/> 

{Binding IsAllowed, Mode=TwoWay, Converter=notConverter} 

public class NotConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     Boolean result = false; 
     if (value is Boolean) 
      result = !((Boolean)value); 
     return result; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     Boolean result = false; 
     if (value is Boolean) 
      result = !((Boolean)value); 
     return result; 
    } 
} 
+0

et comment je lie au bouton Non? – kaycee

+0

{Liaison IsAllowed, Mode = TwoWay, Convertisseur = notConverter} –

4

Vous n'en avez pas besoin. Cela arrivera par défaut.

Assurez-vous simplement que IsAllowed commence par true, et le reste prendra soin d'elle-même. Cela est dû au fait que lorsque vous cliquez sur le bouton No, la valeur cochée du bouton Yes est automatiquement définie (c'est ainsi que fonctionnent les boutons radio), de sorte que le changement se produira automatiquement et que la classe de sauvegarde sera mise à jour.

MEME MIEUX: Utilisez simplement une case à cocher. Les situations Oui/Non sont ce pour quoi elles sont conçues.

1

La réponse ci-dessus fonctionne mais je voulais un convertisseur qui s'appliquerait aux boutons radio Oui et Non et refléterait la valeur des booléens Nullable. Je fis donc l'alternative qui profite des paramètres de conversion:

public class YesNoRadioButtonToBooleanConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return CompareValueWithRequiredValueToBeChecked(value, parameter); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return CompareValueWithRequiredValueToBeChecked(value, parameter); 
    } 

    private bool CompareValueWithRequiredValueToBeChecked(object value, object parameterValue) 
    { 
     bool? convertedValue = ConvertObjectToBool(value); 
     bool? convertedParameter = ConvertObjectToBool(parameterValue); 

     bool result = convertedValue == convertedParameter; 

     return result; 
    } 

    private bool? ConvertObjectToBool(object parameter) 
    { 
     string stringResult = parameter == null ? null : parameter.ToString(); 
     bool? convertedResult; 

     bool convertResultTest = false; 
     if (stringResult != null && !bool.TryParse(stringResult, out convertResultTest)) 
     { 
      throw new InvalidCastException(string.Format("Cannot convert {0} to a bool.", parameter)); 
     } 

     convertedResult = stringResult == null ? (bool?)null : (bool?)convertResultTest; 

     return convertedResult; 
    } 
} 

Voici ce que le XAML ressemble:

<converters:YesNoRadioButtonToBooleanConverter x:Key="yesNoToBool" /> 

    <RadioButton Content="Yes" Name="radYes" GroupName="Group1" IsChecked="{Binding Path=boolProperty1, Mode=TwoWay, Converter={StaticResource yesNoToBool}, ConverterParameter=true}" /> 
    <RadioButton Content="No" Name="radNo" GroupName="Group1" IsChecked="{Binding Path=boolProperty1, Mode=TwoWay, Converter={StaticResource yesNoToBool}, ConverterParameter=false}" />