2010-10-27 8 views
4

J'essaie d'utiliser les paramètres d'application .NET intégrés. Donc, par exemple, j'ai un paramètre utilisateur de l'année.Gestionnaires d'événements de paramètres utilisateur .NET

Si l'utilisateur final modifie le réglage dans le programme, je dois répondre en actualisant les données affichées.

J'ai actuellement code comme ci-dessous pour ce faire:

Settings.Default.PropertyChanged += SettingsChanged; 

//on year change clear out the grid and update the data 
private void SettingsChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "year") 
    { 
     grdStudentCourseSearch.DataSource = null; 
     grdStudentCourseSearch.DataMember = null; 
     UpdateData(); 
    }   
} 

Comme vous pouvez le voir leur semble être seulement un gestionnaire d'événements pour tous les réglages et je suis d'avoir à utiliser e.PropertyName pour comparer une chaîne pour voir quelle propriété a changé. Y a-t-il une meilleure manière de faire cela? Potentiellement, si je change de nom de propriété plus tard, cela pourrait être oublié.

Répondre

1

Je crois qu'il n'y a pas une meilleure façon (en utilisant la classe Paramètres générés), en raison de la mise en œuvre de la classe paramètres Considérons le code de classe générée pour un simple paramètre de chaîne:

public string Test { 
    get { 
     return ((string)(this["Test"])); 
    } 
    set { 
     this["Test"] = value; 
    } 
} 

Comme vous peut voir, il utilise l'indexeur avec une valeur de chaîne - vous n'avez aucun événement spécialisé TestChanged ou une telle. L'appel à OnPropertyChanged est dans le setter indexeur:

set 
{ 
    SettingChangingEventArgs e = new SettingChangingEventArgs(propertyName, base.GetType().FullName, this.SettingsKey, value, false); 
    this.OnSettingChanging(this, e); 
    if (!e.Cancel) 
    { 
     base[propertyName] = value; 
     PropertyChangedEventArgs args2 = new PropertyChangedEventArgs(propertyName); 
     this.OnPropertyChanged(this, args2); 
    } 
} 
0

Vous pouvez simplement créer une variable et lui affecter le paramètre en cours lors de l'exécution, puis mettre à jour la variable une fois qu'elle a été modifiée, après l'avoir comparée à la précédente.

1

Vous pouvez choisir de mettre en œuvre les paramètres comme ceci:

class Settings 
{ 
    public event EventHandler YearChanged; 

    private int _year; 

    public int Year 
    { 
     get { return _year; } 
     set 
     { 
      if (_year != value) 
      { 
       _year = value; 
       OnYearChanged(EventArgs.Empty); 
      } 
     } 
    } 

    protected virtual void OnYearChanged(EventArgs e) 
    { 
     if (YearChanged != null) 
      YearChanged(this, e); 
    } 
} 

Ensuite, vous pouvez vous inscrire sur l'événement YearChanged.

1

Non, ce n'est pas une bonne idée. Le code trop fragile. Attrapez ça plus tôt. Au niveau de l'interface utilisateur, par exemple, quel que soit le code que vous avez qui définit la valeur de réglage. Il peut déclencher l'événement et vous saurez exactement ce qui est modifié. Ou faire une classe d'aide intermédiaire.

0

Dans le cadre .net précédente (3.5 je pense), nous pouvons utiliser nameof mot-clé pour éviter les chaînes magiques, donc e.PropertyChange == nameof (Année). Vous serez donc averti par le compilateur lorsque l'identifiant de la propriété a changé.

Questions connexes