Vous recherchez des indications sur l'emplacement du code dépendant des modifications apportées à une propriété.Lors de l'utilisation d'un modèle MVVM, le code relatif aux modifications de propriétés doit-il figurer dans le setter ou un événement?
Par exemple, j'ai un modèle de vue qui est utilisé pour maintenir l'état pour un des paramètres d'applications
public SettingsViewModel(ISettingsRepository settings)
{
_settings = settings;
// ...
}
Pour chaque modification d'une propriété de paramètres que nous devons persister ce changement dans le référentiel, et sur certaines propriétés , d'autres propriétés sont affectées, un code supplémentaire est donc requis.
J'ai commencé simplement ajouter cette logique au poseur
public ProjectCollection Projects
{
get { return _projects; }
set
{
if (_projects == value) return;
_projects = value;
RaisePropertyChanged("Projects");
// Extra work needed when collection of projects change
_settings.SaveProjects(_projects);
Startable = _projects != null && _projects.Count > 0;
}
}
Mais intervertis pour le câblage en cas PropertyChanged
pour INotifyPropertyChanged
et a retiré le code supplémentaire sur le poseur de propriété
public SettingsViewModel(ISettingsRepository settings)
{
_settings = settings;
// ...
PropertyChanged += onPropertyChanged;
}
void onPropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "Projects":
_settings.SaveProjects(Projects);
Startable = Projects != null && Projects.Count > 0;
break;
// ...
}
}
public ProjectCollection Projects
{
get { return _projects; }
set
{
if (_projects == value) return;
_projects = value;
RaisePropertyChanged("Projects");
}
}
Avoir la logique à l'intérieur du setter signifie moins de code à écrire, moins de chance de faire une erreur en câblant le mauvais nom de propriété (le test unitaire devrait le ramasser) et serait légèrement plus rapide, bien que probablement insignifiant. Avoir la logique câblée à un événement semble être une approche plus maintenable, tant que les méthodes sont nommées de manière appropriée, il devrait être plus facile de suivre le code, et signifie que le setter ne fait pas d'autre travail en dehors de la mise en propriété. Je suppose qu'il pourrait également fournir plus de flexibilité, en utilisant l'exemple ci-dessus, si les exigences changeaient de sorte que la persistance des changements se produise à partir d'un autre événement, par exemple. Bouton "Enregistrer" cliquez sur le changement de propriété, puis le code devrait être plus facile à modifier. J'apprécie que ce soit une question subjective, mais je suis nouveau dans le modèle MVVM (même si je suppose que cela peut être vrai pour n'importe quelle logique de setter?) Donc je cherche d'autres raisons avant de m'arrêter sur une approche. Merci!
Je vote pour des événements. Je n'ai pas grand-chose à ajouter au-delà de ce que vous avez déjà identifié, mais la promotion d'un modèle de vue plus facile à maintenir et le maintien d'un but unique semblent être un choix évident pour moi. Je soupçonne également que vous pouvez vous retrouver avec beaucoup de code en double dans les différents setters; que se passe-t-il si vous en avez plusieurs qui dépendent des mêmes propriétés?Un événement peut ne pas épargner beaucoup de code, mais le fait d'avoir tout en un seul endroit plutôt que de se propager à tous les différents setters semble plus gérable. –
Merci Dan, je me penchais aussi, mais je pense que la réponse des slugsters est encore plus belle. – si618