将自定义对象列表显示为绑定到PropertyGrid中的.Selected对象的对象的属性

时间:2011-03-03 19:19:58

标签: c# propertygrid

我将在这个问题上采取另一个问题b / c我之前发布的原始问题形成不良,我没有做足够的研究,首先提出一个关于PropertyGrid的清晰,简明的问题。希望这会更好。

我想将此对象绑定到Property Grid:

public class Analytic
{
    public enum Period { Daily, Monthly, Quarterly, Yearly};
    public Analytic()
    {
        this.Benchmark = new List<Benchmark>();
    }
    public List<Benchmark> Benchmark { get; set; }
    public Period Periods { get; set; }
    public void AddBenchmark(Benchmark benchmark)
    {
        if (!this.Benchmark.Contains(benchmark))
        {
            this.Benchmark.Add(benchmark);
        }
    }
}

该对象公开两种类型的属性,一种是枚举类型,另一种是自定义类型的Benchmark。我希望这两种类型都显示为下拉列表。我知道PropertyGrid会自动为基于枚举的属性创建一个下拉列表。我的问题是试图将基准列表显示为下拉列表。我想要的是将Benchmark的Name属性作为下拉列表中显示的文本。以下是Benchmark的代码:

public class Benchmark
{
    public Benchmark(string id, string name)
    {
        this.ID = id;
        this.Name = name;
    }
    public string ID { get; set; }
    public string Name { get; set; }
}

尝试使用此调用代码将对象绑定到PropertyGrid:

Analytic analytic = new Analytic();
analytic.AddBenchmark(new Benchmark("1", "BM1"));
analytic.AddBenchmark(new Benchmark("2", "BM2"));
propertyGrid1.SelectedObject = analytic;

导致此输出: enter image description here

在上面的屏幕抓取中,您可以看到Benchmark对象列表呈现为“(Collection)”。我希望每个Benchmark的名称都显示出Periods enum的显示方式。输出将是这样的:

enter image description here

最大的问题是,如何做到这一点?

我见过几个“helper”类继承自“System.ComponentModel.StringConverter”的例子,但这通常假设集合本身是一个数组或一个字符串集合。有很好的例子可以使用StringConverter HERE(构建状态下拉列表)和HERE(构建规则下拉列表)。

在我的示例中,我的集合是自定义类型Benchmark的集合,我仍然不知道:

  1. 如果我可以使用任何基类/接口,这将有助于我做Benchmark需要做的事情,类似于上面两个链接如何帮助String类型。
  2. 如果在网上有一个好的,简单的例子我需要完成的事情
  3. 我觉得疯狂的是,在绑定到PropertyGrid的对象的某些暴露属性上显示非基本类型的下拉列表这样一个微不足道的任务是如此痛苦。

    同样,任何帮助,或任何正确方向的指针都将非常感激。

    谢谢, 麦克

1 个答案:

答案 0 :(得分:1)

我知道这是旧的,但也许它会帮助别人。

在我看来,您可以将此问题分解为两部分:首先,您要在propertygrid中显示字符串的自定义列表。 2,您希望根据该自定义字符串列表中的一个选择在自定义对象中设置属性。以这种方式打破它,它变得非常容易。对于第一部分,您可以使用TypeConverter。

[TypeConverter(typeof(MyCustomSelect))]
public String Flavor { get; set; }

MyCustomSelect是一种只提供可供选择的字符串列表的类型。例如:

public class MyCustomSelect : TypeConverter
{
    public override bool
    GetStandardValuesSupported(ITypeDescriptorContext context)
    {
        return true; // display drop
    }
    public override bool
    GetStandardValuesExclusive(ITypeDescriptorContext context)
    {
        return true; // drop-down vs combo
    }
    public override StandardValuesCollection
    GetStandardValues(ITypeDescriptorContext context)
    {
        // can look at context to build list, if necessary
        return new StandardValuesCollection(new string[] { "abc", "def", "ghi" });
    }
}

好的,现在,这是一个字符串属性。这不是您想要的自定义类型。当为此字符串选择新值时,如何在对象上设置属性?只需实现一个setter。

    [TypeConverter(typeof(MyCustomSelect))]
    public String Flavor
    {
        get { return _flavor; }
        set 
        {
            _flavor = value;
            OtherProperty = OtherCustomObject.Create(_flavor);
        }
    }
    private string _flavor;

    [Browsable(false)]
    public OtherCustomObject OtherProperty { get; set; }

工厂方法OtherCustomObject.Create()留待您实施。


现在,如果您真的想要设置其他自定义对象的List,则需要实现一个集合编辑器,在这个内部,您可以显示下拉列表。