假设我有一个带有整数属性的类,我想在PropertyGrid中显示它。现在,PropertyGrid不应该只是显示整数值,而是显示列表中的相应字符串值,还有一个下拉列表,其中包含该属性的可能值(也作为字符串)。
我知道我必须为此使用TypeConverter,并且我过去已经为字符串属性执行了此操作。但我无法弄清楚如何做到这一点。从我的代码中可以看出,我完全无助:
class MyClassConverter : TypeConverter
{
List<string> values = new List<string>();
public MyClassConverter()
{
values.Add("Value1");
values.Add("Value2");
values.Add("Value3");
}
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
bool ret = true; //base.CanConvertFrom(context, sourceType);
Debug.Print("CanConvertFrom: " + sourceType.ToString() + " " + ret.ToString());
return ret;
}
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
bool ret = base.CanConvertTo(context, destinationType);
Debug.Print("CanConvertTo: " + destinationType.ToString() + " " + ret.ToString());
return ret;
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
Debug.Print("ConvertFrom: " + value.GetType().ToString());
//return base.ConvertFrom(context, culture, value);
for (int i = 0; i < values.Count; i++)
{
if (values[i] == value)
{
return i;
}
}
return -1;
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
Debug.Print("ConvertTo: " + destinationType.ToString());
return base.ConvertTo(context, culture, value, destinationType);
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
Debug.Print("GetStandardValues");
StandardValuesCollection collection = new StandardValuesCollection(values);
return collection;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
}
答案 0 :(得分:0)
您必须以ConvertTo
类型作为输入(以及隐式int
类型作为输出)实现string
,因为您正在与属性网格进行通信。)
此外,如果您想支持直接最终用户int
输入,您还需要从ConvertFrom
实施int
作为string
(如“2”)例子)。
以下是一段似乎有用的代码:
public class MyClassConverter : TypeConverter
{
private List<string> values = new List<string>();
public MyClassConverter()
{
values.Add("Value1");
values.Add("Value2");
values.Add("Value3");
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (value is int)
{
int index = (int)value;
if (index >= 0 && index < values.Count)
return values[index];
return values[0]; // error, go back to first
}
return value;
}
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
string s = value as string;
if (s != null)
{
int index = values.IndexOf(s);
if (index >= 0)
return index;
// support direct integer input & validate
if (int.TryParse(s, out index) && index >= 0 && index < values.Count)
return index;
return 0; // error, go back to first
}
return base.ConvertFrom(context, culture, value);
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
return new StandardValuesCollection(values);
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
}