2011-08-10 4 views
3

J'essaie d'écrire un convertisseur de valeur pour lier la propriété Boolean IsChecked d'un ToggleButton WPF à une valeur non booléenne (qui se trouve être un double) dans mon modèle. La fonction de conversion que j'ai écrit ressemble à ceci:Propriété ValueConverter for IsChecked de WPF Toggle Button

 public object Convert(object value, Type targetType, object paramter, System.Globalization.CultureInfo culutre) 
     { 
      if (targetType != typeof(Boolean)) 
      throw new InvalidOperationException("Target type should be Boolean"); 

      var input = double.Parse(value.ToString()); 

      return (input==0.0) ? false: true; 
     } 

Le problème est que lorsque l'funcion est invoquée, le targetType est pas ce que je pense - c'est

  "System.Nullable`1[[System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]" 

Plutôt que System.Boolean. Est-ce prévu? J'ai écrit d'autres convertisseurs sans souci dans le passé.

Répondre

4

Oui, car un ToggleButton (pensez à une case à cocher) peut avoir trois états: Checked, Unchecked et Ni (la case à cocher serait grisée).

Le MSDN library states:

ToggleButton Class 
Base class for controls that can switch states, such as CheckBox. 

et for IsChecked:

Property Value 
Type: System.Nullable<Boolean> 
true if the ToggleButton is checked; false if the ToggleButton is unchecked; otherwise null. The default is false. 

Donc, si vous lancez un bool? ou Nullable, vous pouvez facilement obtenir la valeur avec .HasValue et .Value.

+0

+1 pour mentionner .HasValue. Lorsque j'ai commencé à utiliser des types Nullable, j'ai eu des problèmes en accédant à Value sans vérifier HasValue. @ _ @ –

3

Ceci est comme prévu; IsChecked est un bool?, et non un bool. Changez votre première ligne à ceci:

if (targetType != typeof(bool?)) 
2

Oui, IsChecked est un booléen « annulable » ... ce qui signifie qu'il pourrait être vrai, faux, ou nulle. Il est assez rare d'avoir un bouton bascule avec une valeur nulle ici mais plus commun sur certaines des sous-classes comme CheckBox.

2

IsChecked est un booléen Nullable. Donc, au lieu de Boolean, vérifiez bool?