StringConverter GetStandardValueCollection

Я пытаюсь использовать сетку свойств для отображения данных. Мне нужно написать StringConverters для моих предопределенных строковых констант, чтобы их можно было отображать в поле со списком.

Рассмотрим список цветов и другой список углов 0,90,180,270. Есть много таких списков, которые я хочу отобразить в сетке.

Я пишу новые классы, производные от StringConverters, и переопределяю GetStandardValues.

class AngleConverter : StringConverter
{
    string[] Units = { "0", "90", "180","270" };
    public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
    {
        return true;
    }
    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
    {
        return new StandardValuesCollection(Units);
    }
    public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
    {
        return true;
    }
}

Класс UnitConverter: ... Тот же код, за исключением изменения в массиве строк. Я использую этот класс перед таким свойством, как [TypeConverter (typeof (AngleConverter))]. Мне нужно создать новый класс, если я хочу добавить список строк, который будет отображаться в поле списка в сетке.

Есть ли общий способ сделать это, не создавая каждый раз новые классы.

Спасибо - Хари


person HAN    schedule 28.10.2010    source источник


Ответы (3)


РЕДАКТИРОВАТЬ: Согласно ответу Томаса Ликена на этом ссылка, это может помочь, если ваши свойства являются перечислениями ...

Не знаю, удастся ли вам избежать написания новых классов. Я недостаточно знаком с тем, что вы делаете, чтобы знать, есть ли значительно лучший или более простой способ или нет. Сказав это, вы можете несколько сократить свой класс, сделав абстрактный базовый класс примерно таким:

class MyBaseStringConverter : StringConverter 
{ 
    public override bool GetStandardValuesSupported(ITypeDescriptorContext context) 
    { 
        return true; 
    } 
    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) 
    { 
        //Call the abstract GetValues function here.
        return new StandardValuesCollection(GetValues()); 
    } 
    public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) 
    { 
        return true; 
    } 
    protected abstract string [] GetValues();
} 

public AngleConverter : MyBaseStringConverter
{
  protected override string [] GetValues() 
  { 
    return new string [] { "0", "90", "180", "270" };
  }
}

public ColorConverter : MyBaseStringConverter
{
  protected override string [] GetValues()
  {
    return new string [] { "Red", "Green", "Blue" };
  }
}
person wageoghe    schedule 28.10.2010

Что ж, я бы написал еще один атрибут, содержащий стандартные значения. Тогда ваш производный класс StringConverter просто обнаружит этот атрибут и получит оттуда значения:

private string _unit = "m/s";

[PropertyValueDisplayedAs(new string[] { "m/s", "km/h" })]
[TypeConverter(typeof(MyStringConverter))]
public string ConstraintString
{
    get { return _unit; }
    set { _unit = value; }
}

Ваш конвертер будет выглядеть так:

public class MyStringConverter : StringConverter
{
    public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
    {
        return true;
    }

    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
    {
        PropertyValueDisplayedAsAttribute attr = (PropertyValueDisplayedAsAttribute)context.PropertyDescriptor.Attributes[typeof(PropertyValueDisplayedAsAttribute)];
        return new StandardValuesCollection(attr.DisplayedValues);
    }
}

Конечно, вы можете кэшировать стандартные значения в конвертере, чтобы не запрашивать их, если они не меняются для каждого свойства. Я позволю вам написать PropertyValueDisplayedAsAttribute, который представляет собой очень простой атрибут, содержащий коллекцию.

person Nicolas Cadilhac    schedule 28.10.2010

В качестве альтернативы вы можете использовать ObjectDataProvider.

Конечно, если я правильно понимаю, чего вы хотите.

См. Также: Привязка к перечислению.

person Y.Yanavichus    schedule 28.10.2010