C# StringConverter GetStandardValueCollection

C# StringConverter GetStandardValueCollection,c#,propertygrid,typeconverter,C#,Propertygrid,Typeconverter,我正在尝试使用属性网格显示数据。我必须为预定义的字符串常量编写StringConverter,以便它们可以显示在组合框中 考虑一个颜色列表和另一个角度列表0,90180270。我想在网格上显示许多这样的列表 我正在编写从StringConverter派生的新类,并重写GetStandardValue class AngleConverter : StringConverter { string[] Units = { "0", "90", "180","270" }; publi

我正在尝试使用属性网格显示数据。我必须为预定义的字符串常量编写StringConverter,以便它们可以显示在组合框中

考虑一个颜色列表和另一个角度列表0,90180270。我想在网格上显示许多这样的列表

我正在编写从StringConverter派生的新类,并重写GetStandardValue

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))]之前使用这个类。 如果我想添加一个字符串列表以显示在网格上的列表框中,我需要创建一个新类

有没有一种通用的方法可以做到这一点,而不必每次都创建新类

谢谢
--Hari

编辑:根据Thomas Lycken对此的回答,如果您的属性是枚举,则可能会有所帮助

我不知道你是否可以避免写新的类。我对你正在做的事情还不够熟悉,不知道是否有更好或更简单的方法。话虽如此,您可以通过如下方式创建抽象基类来缩短类:

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" };
  }
}
或者,您可以使用

当然,如果我没弄错你想要什么


另请参见:。

好吧,我将编写另一个属性来包含标准值。然后,您的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);
    }
}
当然,您可以将标准值缓存在转换器中,以避免在每个属性不更改的情况下请求它们。 我将让您编写PropertyValueDisplayedAtAttribute,它是一个保存集合的非常简单的属性