J'ai un ViewModel qui encapsule certaines propriétés qui sont en cours de modification dans une boîte de dialogue d'options. Je ne peux pas réellement les enregistrer dans les paramètres jusqu'à ce qu'ils appuient sur le bouton Ok, qui finira par appeler Commit sur ce ViewModel particulier.Rédaction d'une maintenable méthode commit
Une seule propriété dans mon ViewModel ressemble à ceci:
public bool SomeProperty
{
get
{
return m_SomeProperty;
}
set
{
if (m_SomeProperty != value)
{
m_SomeProperty = value;
NotifyPropertyChanged("SomeProperty");
}
}
}
private bool m_SomeProperty = Properties.Settings.Default.SomeProperty;
Ainsi, la mise en œuvre normale pour engager serait de le faire:
public void Commit()
{
Properties.Settings.Default.SomeProperty = m_SomeProperty;
// Add other properties here...
}
Ce n'est pas si mal, mais la raison Je n'aime pas cela, c'est que si vous ajoutez une nouvelle propriété, vous devez ajouter du code à deux endroits. J'essaie d'éviter cela quand c'est possible. Au début, j'ai pensé que je pourrais déclarer un événement privé appelé OnCommit et que la méthode Commit soulève cet événement, et que le code de chaque propriété ajoute un gestionnaire d'événement pour l'événement et y écrit les paramètres, mais je Je ne sais pas comment faire cela sans ajouter les gestionnaires d'événements dans le constructeur de toute façon, ce qui n'aide pas la situation.
Des idées? Est-ce que quelqu'un a une façon élégante de faire ce que j'essaie de faire?
EDIT: Merci à sixlettervariables pour la réponse. J'ai pris cette idée et l'a incorporé dans SoapBox Core et ouvert sourced le résultat. Consultez la boîte de dialogue Options pour voir comment cela fonctionne.
+1 Cela ressemble à la meilleure façon de moi. –
C'est une idée très cool. Je me suis rendu compte que je vais aussi en avoir besoin pour les actions d'annulation (pour les réinitialiser aux valeurs sauvegardées). Une question cependant, si j'accède seulement à ceci de l'interface, ai-je besoin de la serrure? –
Si vraiment vous n'aurez un accès fil 'commitActions', alors ne vous ne pas besoin de la serrure. La serrure était simplement une suggestion pour si le code s'implique plus. De plus, vous pouvez créer vos propres classes Undo/Redo qui contiennent une action pour annuler et refaire ce qui s'est passé. – user7116