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