2009-09-04 9 views
3

J'essaie de créer une situation dans laquelle un ou aucun groupe de deux ToggleButton peut être activé à tout moment. Le problème que j'ai est que si je change l'état de la variable de support, l'état de l'interface utilisateur ne se met pas à jour.Problème de liaison WPF ToggleButton IsChecked

J'ai implémenté INotifyPropertyChanged.

J'ai créé mes ToggleButton s comme ceci:

 <ToggleButton IsChecked="{Binding Path=IsPermanentFailureState, Mode=TwoWay}" 
         HorizontalContentAlignment="Center" 
         VerticalContentAlignment="Center"> 
      <TextBlock TextWrapping="Wrap" 
         TextAlignment="Center">Permanent Failure</TextBlock> 
     </ToggleButton> 
     <ToggleButton IsChecked="{Binding Path=IsTransitoryFailureState, Mode=TwoWay}" 
         HorizontalContentAlignment="Center" 
         VerticalContentAlignment="Center"> 
      <TextBlock TextWrapping="Wrap" 
         TextAlignment="Center">Temporary Failure</TextBlock> 
     </ToggleButton> 

Ceci est mes propriétés d'appui (j'utilise le modèle MVVM, les autres liaisons fonctionnent, en cliquant IE sur le ToggleButton n'entre ces paramètres de propriété. quand je change l'état via le code, les boutons bascule ne changent pas d'état visuel. IE Je suis en train de la propriété de support à faux, mais

public bool? IsPermanentFailureState 
    { 
     get { return isPermFailure; } 
     set 
     { 
      if (isPermFailure != value.Value) 
      { 
       NotifyPropertyChanged("IsPermanentFailureState"); 
      } 
      isPermFailure = value.Value; 
      if (isPermFailure) IsTransitoryFailureState = false; 
     } 
    } 

    public bool? IsTransitoryFailureState 
    { 
     get { return isTransitoryFailureState; } 
     set 
     { 
      if (isTransitoryFailureState != value.Value) 
      { 
       NotifyPropertyChanged("IsTransitoryFailureState"); 
      } 
      isTransitoryFailureState = value.Value; 
      if (isTransitoryFailureState) IsPermanentFailureState = false; 
     } 
    } 

Répondre

8

le bouton reste vérifié. le problème est juste que vous » re soulevant le changement de propriété notificati avant de réellement changer la valeur de la propriété. Par conséquent, WPF lit l'ancienne valeur de la propriété, pas la nouvelle. Changer à ceci:

public bool? IsPermanentFailureState 
{ 
    get { return isPermFailure; } 
    set 
    { 
     if (isPermFailure != value.Value) 
     { 
      isPermFailure = value.Value; 
      NotifyPropertyChanged("IsPermanentFailureState"); 
     } 
     if (isPermFailure) IsTransitoryFailureState = false; 
    } 
} 

public bool? IsTransitoryFailureState 
{ 
    get { return isTransitoryFailureState; } 
    set 
    { 
     if (isTransitoryFailureState != value.Value) 
     { 
      isTransitoryFailureState = value.Value; 
      NotifyPropertyChanged("IsTransitoryFailureState"); 
     } 
     if (isTransitoryFailureState) IsPermanentFailureState = false; 
    } 
} 

Soit dit en passant, vous dites que cela fonctionne lorsque vous utilisez l'interface plutôt que le code, mais je ne peux pas le voir pourrait peut-être.

+0

Tu m'as battu Kent. Avoir une flèche vers le haut de moi. –

+1

wow - Je ne suis pas censé être aussi stupide! C'est probablement ce qui arrive quand vous êtes assis et que vous codez tout le temps tout le temps. Merci! –

0

Votre code ne vous semble pas correct: vous notifiez le changement avant de le faire. Je pense que vous devez déplacer votre isPermFailure = value.Value; intérieur:

 if (isPermFailure != value.Value)    
     { 
      isPermFailure = value.Value; 
      NotifyPropertyChanged("IsPermanentFailureState"); 
     } 

et de même pour l'autre.

Je pense que vous voulez déplacer l'autre déclaration là aussi:

 if (isPermFailure != value.Value)    
     { 
      isPermFailure = value.Value; 
      NotifyPropertyChanged("IsPermanentFailureState"); 
      if (isPermFailure) 
       IsTransitoryFailureState = false; 
     } 

sinon vous serez mise en état et de notification sur celui-ci, inutilement.

+1

En ce qui concerne votre dernier commentaire: non, il ne sera pas notifié inutilement. Tout ce qu'il fera, c'est invoquer la propriété inutilement. La logique du setter n'entraînera une notification que si le champ sous-jacent a changé. –

+1

Vous avez absolument raison: choix de mots imprudent, mais je pense toujours que le mien est la meilleure réponse. :-) – serialhobbyist

Questions connexes