StringConverter GetStandardValueCollection - PullRequest
       49

StringConverter GetStandardValueCollection

2 голосов
/ 28 октября 2010

Я пытаюсь использовать сетку свойств для отображения данных. Я должен написать 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;
    }
}

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

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

Спасибо --Hari

Ответы [ 3 ]

2 голосов
/ 29 октября 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, который является очень простым атрибутом, содержащим коллекцию.

2 голосов
/ 28 октября 2010

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

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

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" };
  }
}
0 голосов
/ 28 октября 2010

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

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

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

...