2010-10-12 1 views
1

Tout d'abord j'ai une source de données dans mon projet WinForms où je devais lier le texte dans un CheckedListBox à une propriété nichée dans ce cas, le « Nom »en utilisant PropertyDescriptorCollection fonctionne dans Winforms mais pas Web Control - comment réparer?

objet [0] -> type de iLink - > Name = "adobe"

objet

[1] -> type de iLink -> Name = "flash"

pour ce faire, j'ai trouvé un gars intelligent qui here m'a conduit à une structure comme la code approprié dans la méthode GetView().

Le problème est que cela ne fonctionne pas pour un webcontrol, GetView() ne s'appelle pas. J'aimerais donc savoir quelles modifications j'aurais besoin de supporter pour un webcontrol utilisant cette méthode.

public class ILinkCollection : List<ILink>, ITypedList 
{ 

} 

public class ILinkProgramView : IILinkViewBuilder 
{ 
    public PropertyDescriptorCollection GetView() 
    { 
     List<PropertyDescriptor> props = new List<PropertyDescriptor>(); 
     IProgramDelegate del = delegate(ILink d) 
     { 
      return d.Program.Name; 
     }; 
     props.Add(new ILinkProgramDescriptor("FullName", del, typeof(string))); 
     del = delegate(ILink dl) { return dl.IsActive; }; 
     props.Add(new ILinkProgramDescriptor("IsActive", del, typeof(string))); 
     PropertyDescriptor[] propArray = new PropertyDescriptor[props.Count]; 
     props.CopyTo(propArray); 
     return new PropertyDescriptorCollection(propArray); 
    } 
} 
public class ILinkProgramDescriptor : PropertyDescriptor 
{ 

} 

Je puis définissez la source de données comme si

 ILinkCollection iLinkPrograms = new ILinkCollection(new ILinkProgramView()); 
     clbProgs.DataSource = iLinkPrograms; 
     clbProgs.DisplayMember = "FullName"; 
     clbProgs.ValueMember = "IsActive"; 

Répondre

0

Web des données de liaison ne sont pas contre IList (et donc IListView, ITypedList, etc.), mais plutôt IEnumerable. Ce serait encore bien (la liste estIEnumerable), cependant DataBinder.GetPropertiesFromCache fonctionne au niveau par objet via TypeDescriptor.GetProperties(obj) - ce qui signifie que ITypedList n'obtient pas de recherche. Donc, pour ce faire, vous devrez implémenter ICustomTypeDescriptor sur les articles, ou écrire un TypeDescriptionProvider. Les deux sont difficiles. Et parce qu'il parle d'un seul object, il ne va même pas remarquer ILink - vous aurez besoin de faire cela pour la béton mise (s) en œuvre (s).

Ou plus facile; il suffit de mapper à une classe simple (view-model) pour représenter vos données - cela vous fera gagner beaucoup de temps.

+0

Merci beaucoup. Je voudrais voir si j'arrive quelque part avec le ICustomTypeDescriptor que vous avez mentionné avant d'utiliser un modèle de vue standard. Pouvez-vous me dire si je suis sur la bonne voie ici? Mes objets sont de classe abstraite publique AbstractLink: ISerializable, ILink, IEquatable , ICloneable - donc j'ai besoin d'implémenter ICustomTypeDescriptor aussi pour faire voler ceci? – MikeW

+0

Oui; 'ITypedList' ne fera rien ici. Personnellement, j'essaierais d'éviter cela, cependant. –

Questions connexes