我正在尝试使用属性网格来显示数据。我必须为我的预定义字符串常量编写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
答案 0 :(得分:2)
我不知道你是否可以避免写新课程。如果有一个明显更好或更简单的方法,我对你正在做的事情不太熟悉。话虽如此,你可以通过制作一个像这样的抽象基类来缩短你的课程:
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)