Как контролировать порядок свойств ExpandableObject в сетке свойств winforms? - PullRequest
2 голосов
/ 07 января 2011

У меня есть классы, такие как:

[TypeConverterAttribute(typeof(ExpandableObjectConverter))]
public class Inner
{
   public string Before{get;set}
   public string After(get;set}
}

public class Outer
{
    public Inner Inner {get;set}
}

myPropertygrid.SelectedObject = new Outer();

Я хочу, чтобы свойства «inner» отображались как «До», «После», сетка свойств, кажется, размещает их в алфавитном порядке и, следовательно, отображаетих как «После», «До»

Ответы [ 3 ]

3 голосов
/ 10 января 2011

Мне не нравится это решение, но, похоже, оно работает:

Создайте подкласс «PropertyDescriptorCollection» со всеми переопределенными методами «Sort», чтобы просто вернуть «this».Таким образом, всякий раз, когда сетка свойств вызывает сортировку для изменения порядка свойств, ничего не происходит.

Создайте подкласс «ExpandableObjectConverter», у которого есть переопределенный метод «GetProperties», чтобы вернуть экземпляр «NoneSortingPropertyDescriptorCollection» со свойствамив правильном порядке.

Используйте [TypeConverterAttribute (typeof (MyExpandableObjectConverter))], чтобы получить ваш подкласс ExpandableObjectConverter.

public class NoneSortingPropertyDescriptorCollection : PropertyDescriptorCollection
{
    public NoneSortingPropertyDescriptorCollection(PropertyDescriptor[] propertyDescriptors)
        : base(propertyDescriptors)
    {
    }

    public override PropertyDescriptorCollection Sort()
    {
        return this;
    }
    public override PropertyDescriptorCollection Sort(string[] names)
    {
        return this;
    }

    public override PropertyDescriptorCollection Sort(string[] names, System.Collections.IComparer comparer)
    {
        return this;
    }
    public override PropertyDescriptorCollection Sort(System.Collections.IComparer comparer)
    {
        return this;
    }
}

public class MyExpandableObjectConverter : ExpandableObjectConverter
{
    public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
    {
        PropertyDescriptorCollection d = base.GetProperties(context, value, attributes);

        List<PropertyDescriptor> props = new List<PropertyDescriptor>();
        props.Add(d.Find("Before", false));
        props.Add(d.Find("After", false));

        NoneSortingPropertyDescriptorCollection m = new NoneSortingPropertyDescriptorCollection(props.ToArray());
        return m;
    }
}

[TypeConverterAttribute(typeof(MyExpandableObjectConverter))]      
public class Inner      
{         
   public string Before{get;set}        
   public string After(get;set}      
}    
2 голосов
/ 30 октября 2014

Я знаю, что это старый вопрос, но это решение проще принятого:

public class MyExpandableObjectConverter : ExpandableObjectConverter
{
    public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
    {
        return TypeDescriptor.GetProperties(typeof(Inner), attributes).Sort(new[] { "Before", "After" });
    }
}

[TypeConverterAttribute(typeof(MyExpandableObjectConverter))]
public class Inner
{
    public string Before { get; set; }
    public string After { get; set; }
}
1 голос
/ 07 января 2011

Используйте свойство PropertyGrid.PropertySort , чтобы изменить порядок свойств.Возможные значения:

NoSort
Alphabetical
Categorized
CategorizedAlphabetical

Я бы предложил NoSort в качестве подходящего значения для вас.

...