结合 ExpandableObjectConverter 与下拉列表
Combine ExpandableObjectConverter with Drop Down List
我的 class 中有一个可为 null 的 属性,我希望用户能够使用 PropertyGrid 创建其实例。我使用 ExpandableObjectConverter
.
创建实例后,它会自动出现在 PropertyGrid 中,可以展开它并更改其属性值。
我仍然需要输入一些字符串来创建一个新实例。
这就是为什么我想知道是否可以将 ExpandableObjectConverter
与 DropDownList 结合使用。因此用户将能够 select 现有值之一。
您需要创建一个新的ExpandableObjectConverter
,支持标准值。
例子
举个例子,xlass A
有一个 属性 类型 B
,我们想让用户为 B
选择一些预定义的值来自 属性 网格中的下拉列表。
在您从下拉列表中 select 之后,B
将被初始化,您仍然可以编辑 C
:
这是 A
和 B
的定义:
public class A
{
[TypeConverter(typeof(BConverter))]
public B B { get; set; }
}
public class B : ICloneable
{
[RefreshProperties(RefreshProperties.All)]
public string C { get; set; }
public object Clone()
{
return new B { C = this.C };
}
public override string ToString()
{
return C;
}
}
这里是习俗ExpandableObjectConverter
:
public class BConverter : ExpandableObjectConverter
{
B[] values = new B[] { new B { C = "Something" }, new B { C = "Something else" } };
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
return true;
return base.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context,
System.Globalization.CultureInfo culture, object value)
{
var result = values.Where(x => $"{x}" == $"{value}").FirstOrDefault();
if (result != null)
return result.Clone();
return base.ConvertFrom(context, culture, value);
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext c)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext c)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext c)
{
return new StandardValuesCollection(values);
}
}
我的 class 中有一个可为 null 的 属性,我希望用户能够使用 PropertyGrid 创建其实例。我使用 ExpandableObjectConverter
.
创建实例后,它会自动出现在 PropertyGrid 中,可以展开它并更改其属性值。
我仍然需要输入一些字符串来创建一个新实例。
这就是为什么我想知道是否可以将 ExpandableObjectConverter
与 DropDownList 结合使用。因此用户将能够 select 现有值之一。
您需要创建一个新的ExpandableObjectConverter
,支持标准值。
例子
举个例子,xlass A
有一个 属性 类型 B
,我们想让用户为 B
选择一些预定义的值来自 属性 网格中的下拉列表。
在您从下拉列表中 select 之后,B
将被初始化,您仍然可以编辑 C
:
这是 A
和 B
的定义:
public class A
{
[TypeConverter(typeof(BConverter))]
public B B { get; set; }
}
public class B : ICloneable
{
[RefreshProperties(RefreshProperties.All)]
public string C { get; set; }
public object Clone()
{
return new B { C = this.C };
}
public override string ToString()
{
return C;
}
}
这里是习俗ExpandableObjectConverter
:
public class BConverter : ExpandableObjectConverter
{
B[] values = new B[] { new B { C = "Something" }, new B { C = "Something else" } };
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
return true;
return base.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context,
System.Globalization.CultureInfo culture, object value)
{
var result = values.Where(x => $"{x}" == $"{value}").FirstOrDefault();
if (result != null)
return result.Clone();
return base.ConvertFrom(context, culture, value);
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext c)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext c)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext c)
{
return new StandardValuesCollection(values);
}
}