2 votes

Liaison bidirectionnelle avec le paramétrage de l'utilisateur ?

J'ai un paramètre booléen dans mon fichier Properties/Settings.settings, qui stocke essentiellement le mode d'affichage "Droite à gauche" ou "Gauche à droite" par utilisateur.

J'ai une case à cocher dans mon ruban que j'ai liée à la valeur. Il semble cependant que la liaison ne soit que dans un seul sens. Existe-t-il un moyen de rendre cette liaison bidirectionnelle sans avoir à écrire du code pour conserver le paramètre ?

Clarification

J'ai réussi à configurer l'application pour qu'elle se lie aux paramètres lorsqu'elle est chargée pour la première fois. Le problème est qu'il s'agit d'une liaison unidirectionnelle, c'est-à-dire que l'interface utilisateur est mise à jour lorsque les paramètres sont modifiés, mais que les paramètres ne sont pas modifiés lorsque l'interface utilisateur est modifiée.

D'où ma question : comment puis-je configurer la liaison bidirectionnelle par rapport aux paramètres de l'utilisateur ?

Je peux écrire des gestionnaires d'événements pour faire tout cela manuellement, mais je pense que cela va à l'encontre de l'intérêt d'utiliser la liaison.

4voto

Justin Pihony Points 21088

OK, après quelques recherches, il apparaît que vous devrez quelque peu mettre cela en œuvre, mais ce ne sera peut-être pas aussi propre que vous le souhaitez. Fondamentalement, votre objet de liaison doit implémenter INotifyPropertyChanged (c'est la partie qui me posait problème... je pensais que la CheckBox devait implémenter cette interface, mais c'est l'objet auquel la case à cocher est liée), que Properties.Settings.Default ne. Il vous suffit donc de procéder comme suit

Accrocher l'événement OnPropertyChanged de Property.Settings.Default :

Properties.Settings.Default.PropertyChanged +=
    new PropertyChangedEventHandler(Default_PropertyChanged);

Ensuite, lorsqu'une propriété liée est modifiée, il suffit d'appeler la méthode Save :

void Default_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    Properties.Settings.Default.Save();
}

Fondamentalement, lorsque vous liez l'objet, cela modifie la valeur de l'élément Settings.Default.[Setting] de manière appropriée. Il n'appelle tout simplement pas Save sur chacun de ces changements. Vous devez mettre en œuvre cette partie des choses.

1voto

Martin Points 789

Cela fonctionne sur ma machine uniquement en utilisant visual studio designer, donc j'essaierais d'écarter d'autres possibilités.

Tout d'abord, je mettrais la case à cocher sur un formulaire normal et je verrais si cela peut aider. Quel composant/bibliothèque utilisez-vous pour le ruban ? Utilisez-vous DevExpress ? Je sais que DevExpress ne prend pas en charge les liaisons de données pour les commandes de ruban. Utilisez-vous d'autres composants ou votre propre code pour cela ?

Deuxièmement, il convient de noter que l'ordre des événements n'est pas celui auquel on pourrait s'attendre. Il se peut très bien que l'événement CheckedChanged soit déclenché en premier et que la valeur soit ensuite synchronisée avec les paramètres. Ainsi, au lieu d'utiliser l'événement CheckedChanged, j'utiliserais un bouton séparé qui recevrait le focus et vérifierait dans ce gestionnaire si la valeur est synchronisée.

Troisièmement, vous pouvez également surcharger l'événement CheckedChanged et transférer la nouvelle valeur de liaison de données à la source de données sous-jacente. C'est ce que j'ai fait pour de nombreux contrôles et cela fonctionne à merveille.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X