c# - 将 ExpandableObjectConverter 与下拉列表结合起来

标签 c# .net winforms propertygrid

我的类中有一个可为空的属性,我希望用户能够使用 PropertyGrid 创建其实例。我使用 ExpandableObjectConverter 做到了这一点。

创建实例后,它会自动出现在 PropertyGrid 中,并且可以展开它并更改其属性值。

我仍然需要输入一些字符串来创建一个新实例。

这就是为什么我想知道是否可以将 ExpandableObjectConverter 与 DropDownList 结合起来。因此用户将能够选择现有值之一。

最佳答案

您需要创建一个新的ExpandableObjectConverter,支持标准值。

示例

举个例子,假设 xlass A 有一个 B 类型的属性,我们希望让用户为 B< 选择一些预定义值 从属性网格的下拉列表中。

从下拉列表中选择某些内容后,B 将被初始化,您仍然可以编辑 C:

enter image description here

以下是 AB 的定义:

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

关于c# - 将 ExpandableObjectConverter 与下拉列表结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53832487/

相关文章:

c# - Azure Function 引用混合模式程序集

c# - 如何找到 ResourceManager 中可用的资源文化?

c# - 如何像 DebugView 应用程序一样读取 c# Debug.WriteLine?

c# - 在 Windows 窗体中显示插入数据异常

c# - C#图像处理非常慢

c# - image .net 4.5 的自定义绘图部分

c# - 获取ListBox的选定索引和选定值

c# - 如何提高该算法的性能?

c# - 检查给定的路径字符串是否无效

c# - 模板中的服务器控件如何对数据上下文敏感?