2013-08-26 17 views
5

Ho visto molti post su come associare un valore booleano a un pulsante di opzione. Ma il mio scenario è che ho bisogno di associarlo a un pulsante di opzione e leggere la selezione dall'utente.Bind Xaml Radio button to boolean

Questa opzione non deve essere selezionata inizialmente.

Se lo si associa a un booleano, poiché booleano non può essere nullo mostra il valore predefinito selezionato nel pulsante di opzione.

Se utilizzo il valore booleano nullable, il valore predefinito è false quando si tenta di utilizzare il convertitore.

Non posso utilizzare la modalità oneway in xaml in quanto è necessario verificare se è stata effettuata la selezione del pulsante di opzione che utilizzo utilizzando la variabile limitata.

Puntatori di formica su come ottenere questo risultato?

+0

Se è un booleano, perché vuoi associare a un pulsante di opzione? Non sarebbe meglio una casella di controllo? – ChrisF

+0

Ho considerato la casella di controllo ma non mi avrebbe dato lo stesso problema ?? selectedvalue è associato a un booleano e utilizzando il convertitore avrà lo stesso problema ?? –

+0

No. Quando booleano è falso, la casella di controllo è vuota. Quando è vero è controllato. È inoltre possibile associarlo a un valore booleano annullabile e impostarlo come un terzo stato indeterminato della casella di controllo. Cosa stai cercando di ottenere qui? Cosa rappresenta questo booleano? – ChrisF

risposta

5

È possibile associare un valore booleano nullable ai pulsanti di opzione, ma è necessario farlo tramite un convertitore.

Prima dichiarare la variabile:

private bool? answer; 
public bool? Answer 
{ 
    get { return answer; } 
    set 
    { 
     answer = value; 
     if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Answer")); 
    } 
} 

e inizializzare a null.

Poi nel XAML:

<Window.Resources> 
    <local:BooleanConverter x:Key="BooleanConverter"/> 
</Window.Resources> 

<StackPanel Grid.Row="1"> 
    <RadioButton Content="I Agree" 
       IsChecked="{Binding Answer, 
          Converter={StaticResource BooleanConverter}, 
          ConverterParameter='true', Mode=TwoWay}" /> 
    <RadioButton Content="I Disagree" 
       IsChecked="{Binding Answer, 
          Converter={StaticResource BooleanConverter}, 
          ConverterParameter='false', Mode=TwoWay}" /> 
</StackPanel> 

E infine il convertitore:

class BooleanConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var test = (bool?)value; 
     var result = bool.Parse((string)parameter); 

     if (test == result) 
     { 
      return true; 
     } 

     return false; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var result = bool.Parse((string)parameter); 
     return result; 
    } 
} 

Questo si lega il pulsante di scelta per Answer e afferma che il primo sarà controllato solo quando il valore è true e il secondo verrà controllato quando la risposta è false. È quindi possibile verificare che Answer non sia null prima di consentire all'utente di procedere.

+0

Grazie ... Sto usando la stessa identica cosa, ma per qualche ragione, prima che la mia vista venga caricata, i booleani vengono impostati su false. Pensavo fosse a causa del convertitore. Controllare che cosa sta succedendo e tornare indietro –

+1

@ashishg - Assicurati di impostare il valore nullo booleano per 'null' esplicitamente nel costruttore. – ChrisF

+0

Questo funziona .. il problema era che stavo usando gli stessi nomi di variabili degli altri definiti da qualche parte ma disponibili qui e ogni volta che la vista viene caricata è stata aggiornata. –

0

Questo potrebbe non essere il modo migliore per farlo, ma è possibile utilizzare qualcosa di simile a questo: checkbox like radiobutton wpf c# e avere solo due controlli.

Apprezzo che non sia il massimo, ma leggendo la tua risposta ti dà quello che vuoi (in generale).

+0

Ho pensato di attivare l'evento selezionando/deseleziona e lo faccio, ma sì, considerato che non sarebbe una grande soluzione e pubblicato qui per vedere se c'è un modo migliore per farlo –