Question

je besoin d'un BindingList dans mon interface utilisateur pour fournir databinding les deux sens entre ma collection et un DataGridView. semble, il ne porte toutefois pas correct de renvoyer une BindingList de votre couche d'affaires (ou couche de domaine, couche de service, couche de données, etc.). Autrement dit, je n'utiliser un BindingList en raison d'une exigence de l'interface utilisateur, et maintenant ce besoin d'assurance-chômage serait couplé avec ma couche de domaine.

Quelle est la manière découplée « appropriée » pour le faire? Au cas où je rentrais un IList puis le copier dans un BindingList à des fins de présentation? D'un point de vue réel du monde, est-ce quelque chose de la valeur au-dessus?

Était-ce utile?

La solution

Je pense que la couche de domaine retournerait les types plus génériques et si elles notifieraient (ObservableCollection<>) ou non (IEnumerable<> ou IList<>) appartient aux exigences.

La couche d'interface utilisateur peut les traiter tranforming comme ils le souhaitent (ou non) dans IBindingList si elles ont besoin de cette fonctionnalité.

Nous avons utilisé BindableLinq à grand succès pour atteindre les objectifs de la notification / liste de liaison de (peut-être synchronisé avec les filtres ) à la couche d'interface utilisateur.

Autres conseils

Il n'y a pas de copie d'un IList (au moins j'espère que vous ne voulez pas vraiment créer une copie / clone). Tout ce que vous faites habituellement est de créer une autre référence sur le même objet IList. Donc, en retournant un objet IList est mauvais rien.

Vous pouvez renvoyer par exemple une liste objet et soumettons en rapport de la BindingList (qui est situé dans votre interface utilisateur).

À mon avis, il est préférable de retourner un IList (Liste, Hashtable aso) objet d'une BindingList que vous pouvez utiliser l'ancien sur différentes interfaces (console, Web, Win, Service). Par exemple. en utilisant un BindingList ne serait pas d'un avantage dans une application Web.

Je ne sais pas ce que la façon « correcte » est, mais je les cadres utilisés comme AAPC dans le passé et je sais qu'il a utilisé un BindingList et maintenant ObservableCollection pour les listes d'entreprises. Cela fait en utilisant les objets métier dans l'interface utilisateur très simple que l'interface utilisateur mettrait à jour lorsque les éléments ont été ajoutés ou supprimés des listes. Si vous retournez un IList puis copiez-le dans un BindingList vous devez surveiller manuellement et les changements de poignée à l'IList et de traduire ceux du BindingList. Ma préférence personnelle est d'avoir une fonctionnalité riche couche d'affaires lorsque cela est possible, qui utiliserait un BindingList ou ObservableCollection pour présenter la couche d'affaires à l'interface utilisateur.

Si vous voulez que les éléments d'interface utilisateur pour modifier le modèle d'affaires sans mettre en œuvre vos propres gestionnaires d'événements, le modèle d'affaires doit avoir un BindingList.

Chaque fois que vous faites quelque chose comme new BindingList<MyWidget>( list ) vous découplage la liaison de la liste des racines. Si un élément est modifié, il sera tout fin de travail, mais les ajouts et les suppressions ne seront pas reflétées dans la liste originale.

J'ai récemment essayé la mise en œuvre quelque chose comme ça, en tapant dans l'événement ListChanged BindingList, qui a mis à jour mon modèle pour tenir compte du BindingList change, mais si le modèle a été modifié par le contrôleur, il n'a pas mis à jour le BindingList dans l'interface utilisateur.

Vous pouvez produire des accesseurs spéciaux à vos listes d'événements soulèvent chaque fois que vous ajoutez ou supprimer des éléments de la liste, mais ce n'est de réinventer la roue BindingList avec plus de frais généraux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top