StringConverter GetStandardValueCollection

时间:2010-10-28 18:27:26

标签: c# propertygrid typeconverter

我正在尝试使用属性网格来显示数据。我必须为我的预定义字符串常量编写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 个答案:

答案 0 :(得分:2)

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

我不知道你是否可以避免写新课程。如果有一个明显更好或更简单的方法,我对你正在做的事情不太熟悉。话虽如此,你可以通过制作一个像这样的抽象基类来缩短你的课程:

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" };
  }
}

答案 1 :(得分:2)

好吧,我会写另一个属性来包含标准值。然后你的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 :(得分:0)

或者,您可以使用ObjectDataProvider

当然,如果我理解你想要什么。

另请参阅:Binding to enumeration