【问题标题】:displaying a list of custom objects as a property of an object bount to .SelectedObject in PropertyGrid将自定义对象列表显示为绑定到属性网格中的 .Selected 对象的对象的属性
【发布时间】:2011-07-08 07:26:39
【问题描述】:

我将再次破解这个问题 b/c 我之前发布的原始问题格式不正确,而且我没有先做足够的研究来提出一个关于 PropertyGrid 的清晰、简洁的问题。希望这会更好。

我想将此对象绑定到属性网格:

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;

结果如下:

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

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

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

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

  1. 如果有任何我可以使用的基类/接口将帮助我为 Benchmark 做我需要做的事情,类似于上述两个链接对字符串类型的帮助。
  2. 如果网上有一个简单的好例子说明我需要完成什么

在绑定到 PropertyGrid 的对象的一些公开属性上显示非原始类型的下拉列表这样一项微不足道的任务是如此痛苦,我觉得这太疯狂了。

再次感谢任何帮助或任何正确方向的指示。

谢谢, 迈克

【问题讨论】:

    标签: c# propertygrid


    【解决方案1】:

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

    在我看来你可以把这个问题分解成两部分:首先,你想在属性网格中显示一个自定义的字符串列表。第二,您想在自定义对象中设置一个属性,基于该自定义字符串列表中的一个选择。以这种方式分解它,它变得非常容易。对于第一部分,您可以使用 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" });
        }
    }
    

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

        [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()留给你实现。


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

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      相关资源
      最近更新 更多