2009-09-14 8 views
3

Dites que j'ai un bouton sur un formulaire que je veux désactiver si certaines conditions sont remplies. Existe-t-il un moyen de vérifier cette condition dans le gestionnaire d'événements "IsEnabled" du bouton et de modifier l'état activé de sorte que définir l'état activé une deuxième fois ne déclenche pas un autre appel au gestionnaire d'événements IsEnabled?Comment marquer le gestionnaire d'événements C# comme "géré"?

Permettez-moi de démontrer:

private void ExportResults_IsEnabledChanged (object sender, DependencyPropertyChangedEventArgs e) 
{ 
if (some condition) 
{ 
    uxExportResults.IsEnabled = false; // this will cause another call to the event handler, eventually resulting in a stack overflow 
} 
} 

On suppose Je déclenche l'événement ailleurs (que je suis).

+0

Cela doit être un problème spécifique à la mise en œuvre de ce bouton. De nombreux événements de changement de propriété ne se déclenchent que si la valeur change réellement. –

+0

Supposons que je déclenche l'événement ailleurs. Je vais ajouter ce détail. –

Répondre

4
if (someCondition && uxExportResults.IsEnabled) { ... } 

Cela ne désactivera votre contrôle que s'il est activé.

+0

Jon, je ne peux pas taper assez vite, vous êtes la réponse est apparue pendant que je tapais. –

2

La solution la plus simple consiste à vérifier la valeur de IsEnabled avant de la définir.

private void ExportResults_IsEnabledChanged (object sender, DependencyPropertyChangedEventArgs e) 
{ 
    if (uxExportResults.IsEnabled == true) 
    { 
    uxExportResults.IsEnabled = false; 
    } 
} 

En outre, si vous avez la possibilité de modifier le code du bouton, IsEnabled ne devrait pas envoyer l'événement à moins que la valeur change réellement.

public bool IsEnabled 
{ 
    get { return isEnabled; } 
    set 
    { 
    if(isEnabled != value) 
    { 
     isEnabled = value; 
     IsEnabledChanged(this,args); 
    } 
    } 
} 
3

Une autre option est de désactiver temporairement l'événement comme ceci:

private void ExportResults_IsEnabledChanged (object sender, DependencyPropertyChangedEventArgs e) 
{ 
    if (some condition) 
    { 
     uxExportResults.IsEnabledChanged -= ExportResults_IsEnabledChanged; 
     try 
     { 
      uxExportResults.IsEnabled = false; // this will cause another call to the event handler, eventually resulting in a stack overflow 
     } 
     finally 
     { 
      uxExportResults.IsEnabledChanged += ExportResults_IsEnabledChanged; 
     } 
    } 
} 
+0

hmmm, ça sonnait comme une bonne idée, sauf que ça ne semble pas désactiver le gestionnaire d'évènement. –

+0

Vous avez raison, il ne désactive pas le gestionnaire d'événements; il arrête d'écouter les événements de cette instance particulière. Si ce gestionnaire écoutait des événements sur plusieurs boutons, il continuerait à les recevoir. Peut-être que vous avez ajouté le même écouteur d'événement plusieurs fois? Je mettrais un point d'arrêt sur chaque ligne comme "uxExportResults.IsEnabledChanged + =" pour voir s'ils sont appelés plus d'une fois. –

Questions connexes