Использование PropertyDescriptorCollection работает в Winforms, но не в Web Control - как это исправить? - PullRequest
1 голос
/ 12 октября 2010

Прежде всего, у меня есть источник данных в моем проекте winforms, где мне нужно было привязать текст в поле selectedlist к вложенному свойству, в данном случае «Имя»

object [0] -> тип ILink -> Name = "adobe"

object [1] -> тип ILink -> Name = "flash"

Для этого я нашел более умного парня здесь , который привел меня к структуре, подобной соответствующему коду в методе GetView ().

Проблема в том, что это не работает для веб-управления, GetView () не вызывается. Поэтому я хотел бы знать, какие модификации мне понадобятся для поддержки веб-управления с использованием этого метода.

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
{

}

Затем я устанавливаю источник данных следующим образом:

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

1 Ответ

0 голосов
/ 12 октября 2010

Веб-привязка данных не против IList (и, следовательно, IListView, ITypedList и т. Д.), А скорее IEnumerable.Это все равно было бы хорошо (список равен IEnumerable), однако DataBinder.GetPropertiesFromCache работает на уровне каждого объекта через TypeDescriptor.GetProperties(obj) - это означает, что ITypedList не ищет.1011 *

Итак, для этого вам нужно будет либо внедрить ICustomTypeDescriptor на предметах, либо написать TypeDescriptionProvider.Оба хитры.И поскольку речь идет об одном object, он даже не собирается замечать ILink - вам нужно будет сделать это для конкретных реализаций.

Или проще;просто сопоставьте простой класс (view-модель) для представления ваших данных - это сэкономит вам много времени.

...