2010-02-15 7 views
2

Je suivais le modèle de conception presentation model suggéré par Martin Fowler pour mon architecture graphique dans un projet Windows Forms.Windows Forms radioButton liaison de données

"L'essence d'un modèle de présentation est d'une classe entièrement autonome qui représente toutes les données et le comportement de la fenêtre de l'interface utilisateur, mais sans aucun des contrôles utilisés pour afficher cette interface utilisateur sur l'écran. Je projette simplement l'état du modèle de présentation sur la vitre .... " - Martin Fowler

Je trouve le concept très fluide et facile à comprendre à part ce problème de liaison de données RadioButtons aux propriétés sur le Data/Domain objet.

Supposant J'ai un formulaire Windows avec trois boutons radio pour représenter certaines options "Mode", comme -

  • Auto
  • Manuel
  • importation

Comment puis-je utiliser les propriétés booléennes sur Data/Domain Objects à DataBind à ces boutons? J'ai essayé beaucoup de manières mais en vain. Par exemple, je voudrais code comme -

rbtnAutoMode.DataBindings.Add("Text", myBusinessObject, "IsAutoMode"); 
rbtnManualMode.DataBindings.Add("Text", myBusinessObject, "IsManualMode"); 
rbtnImportMode.DataBindings.Add("Text", myBusinessObject, "IsImportMode"); 

Il devrait y avoir une quatrième propriété comme « selectedMode » sur l'objet de données/domaine qui, à la fin devrait représenter une valeur unique comme « selectedMode = Auto ». Je suis en train de mettre à jour cette propriété lorsque l'un des « IsAutoMode », « IsManualMode » ou « IsImportMode » est modifié, par exemple à travers les setters de la propriété. J'INotifyPropertyChanged mis en œuvre sur mon objet de données/domaine afin, mettre à jour les données propriété/objet domaine met à jour automatiquement mes contrôles de l'interface utilisateur, ce n'est pas un problème.

Il est un bon exemple de lier deux boutons radio dans Stack Overflow   question How do I use databinding with Windows Forms radio buttons?, mais je manque le lien tout en appliquant la même chose avec trois boutons. J'ai des comportements très erratiques pour les boutons radio.

J'espère que j'ai pu l'expliquer raisonnablement. Je suis en fait pressé et ne pouvait pas mettre un code détaillé sur le post, mais toute aide à cet égard est apprécié.

Il y a une solution simple à ce problème en exposant une méthode comme -

public void SetMode(Modes mode) 
{ 
    this._selectedMode = mode; 
} 

qu'on pourrait appeler de la « CheckedChanged » événement des boutons radio de l'interface utilisateur et serait parfaitement régler la « selectedMode » sur l'objet métier, mais j'ai besoin d'étirer les limites pour vérifier si cela peut être fait par DataBinding.

Répondre

6

Ma classe Domain/Business Model contient une propriété "Mode" de type "chaîne". Pour les modes AUTO/MANUEL/IMPORTATION, la propriété de mode doit contenir "A"/"M"/"I" respectivement. Mon modèle de domaine est reçu par ma classe Presentation Model via le constructeur dans le modèle de présentation.

Ma classe Presentation Model contient trois variables booléennes telles que "IsAutoMode", "IsManualMode", "IsImportMode". Ces variables booléennes seront utilisées pour DataBinding les boutons radio sur le formulaire. Le GET/SET pour ces propriétés booléennes est un peu étendu pour gérer la mise à jour de la propriété correspondante ("Mode") dans le modèle de domaine.Notez que le code de la propriété GET/SET dans le modèle de présentation classe ci-dessous -

public bool IsAutoMode 
    { 
     get 
     { 
      return _domainModel.Mode.ToUpper() == "A"; 
     } 
     set 
     { 
      _domainModel.Mode = (value == true) ? "A" : _domainModel.Mode; 
     } 
    } 
    public bool IsManualMode 
    { 
     get 
     { 
      return _domainModel.Mode.ToUpper() == "M"; 
     } 
     set 
     { 
      _domainModel.Mode = (value == true) ? "M" : _domainModel.Mode; 
     } 
    } 
    public bool IsImportMode 
    { 
     get 
     { 
      return _domainModel.Mode.ToUpper() == "I"; 
     } 
     set 
     { 
      _domainModel.Mode = (value == true) ? "I" : _domainModel.Mode; 
     } 
    } 

Maintenant, une fois ces propriétés booléennes sont configurés dans votre présentation classe modèle, vous pouvez DataBind facilement les boutons de commande radio sur votre formulaire ci-dessous

rbtnAutoMode.DataBindings.Add("Checked", _pmodel, "IsAutoMode"); 
rbtnManualMode.DataBindings.Add("Checked", _pmodel, "IsManualMode"); 
rbtnImportMode.DataBindings.Add("Checked", _pmodel, "IsImportMode"); 

et consultez votre radio bouton databinding mouche. L'exemple actuel est valide quel que soit le type de propriété que vous voulez conserver dans le modèle de domaine, qu'il s'agisse d'une "chaîne", d'un "booléen" ou de n'importe quoi. Le point clé est de compter sur -

get 
{ 
    return _domainModel.Mode.ToUpper() == <corresponding domain property val>; 
} 

dans la propriété GET plutôt que de retourner la valeur du champ local et à NE PAS mettre une valeur dans le modèle de domaine dans le cas où la « valeur » qui vient dans le SET de la propriété est pas TRUE, sinon laissez le modèle de domaine ont sa valeur actuelle

set 
{ 
    _domainModel.Mode = (value == true) ? <domain property to set> : _domainModel.Mode; 
} 

Un autre point important est que ce type de RadioButton databinding ne fonctionne que lorsque le Binding.DataSourceUpdateMode est réglé sur OnValidation qui est la valeur par défaut. Si elle est remplacée par OnPropertyChanged, la séquence de déclenchement d'événement des propriétés, lors du passage d'un bouton à un autre, se comporte d'une manière qui empêche l'évaluation de la valeur de propriété correcte pour le bouton sur lequel le contrôle se déplace. Mais le DataSourceUpdateMode est à peine modifié dans les applications normales et heureusement, cela fonctionnera pour la plupart des applications avec DEUX ou plus de radiobuttons.

(je voyais que cette question obtenait une bonne vue, mais il n'y a pas de réponse posté. Je pensais que je devrais partager ce que j'ai finalement fait pour résoudre ce problème.)