【发布时间】:2011-07-07 11:04:57
【问题描述】:
我想拿一个物体,比如说这个物体:
public class BenchmarkList
{
public string ListName { get; set; }
public IList<Benchmark> Benchmarks { get; set; }
}
并让该对象将其 ListName 显示为 PropertiesGrid 的“名称”部分(“基准”会很好),对于 PropertyGrid 的“值”部分,有一个 IList 的下拉列表 基准:
这里是基准对象
public class Benchmark
{
public int ID {get; set;}
public string Name { get; set; }
public Type Type { get; set; }
}
我希望下拉菜单显示用户可以看到的 Benchmark 的 Name 属性。这是一个视觉示例:
因此,本质上,我正在尝试将 Benchmark 对象的集合放入下拉列表中,这些对象应将其 Name 属性显示为下拉列表中的值。
我读过其他关于使用 PropertiesGrid 的文章,包括 THIS 和 THIS,但它们比我想要做的要复杂。
我通常处理服务器端的东西,不通过 WebForms 或 WinForms 处理 UI,所以这个 PropertiesGrid 真的很带我去兜风......
我知道我的解决方案在于实现“ICustomTypeDescriptor”,这将允许我告诉 PropertiesGrid 它应该显示什么值,而不管我想绑定到下拉列表中的对象的属性,但是我只是不确定如何或在哪里实现它。
任何指针/帮助将不胜感激。
谢谢, 迈克
更新:
好的,所以我稍微改变一下细节。我之前在我认为应该涉及的对象上做得太过火了,所以这是我的新方法。
我有一个名为 Analytic 的对象。这是应该绑定到 PropertiesGrid 的对象。现在,如果我公开一个枚举类型的属性,PropertiesGrid 将为我处理下拉列表,这非常好。如果我公开一个作为自定义类型集合的属性,PropertiesGrid 就不那么好了...
这里是 Analytic 的代码,我想绑定到 PropertiesGrid 的对象:
public class Analytic
{
public enum Period { Daily, Monthly, Quarterly, Yearly };
public Analytic()
{
this.Benchmark = new List<IBenchmark>();
}
public List<IBenchmark> Benchmark { get; set; }
public Period Periods { get; set; }
public void AddBenchmark(IBenchmark benchmark)
{
if (!this.Benchmark.Contains(benchmark))
{
this.Benchmark.Add(benchmark);
}
}
}
以下是实现 IBenchmark 接口的两个对象的简短示例:
public class Vehicle : IBenchmark
{
public Vehicle()
{
this.ID = "00000000-0000-0000-0000-000000000000";
this.Type = this.GetType();
this.Name = "Vehicle Name";
}
public string ID {get;set;}
public Type Type {get;set;}
public string Name {get;set;}
}
public class PrimaryBenchmark : IBenchmark
{
public PrimaryBenchmark()
{
this.ID = "PrimaryBenchmark";
this.Type = this.GetType();
this.Name = "Primary Benchmark";
}
public string ID {get;set;}
public Type Type {get;set;}
public string Name {get;set;}
}
这两个对象将被添加到 WinForms 代码中 Analytic 对象的 Benchmark List 集合中:
private void Form1_Load(object sender, EventArgs e)
{
Analytic analytic = new Analytic();
analytic.AddBenchmark(new PrimaryBenchmark());
analytic.AddBenchmark(new Vehicle());
propertyGrid1.SelectedObject = analytic;
}
这是 PropertiesGrid 中输出的屏幕截图。请注意,作为枚举公开的属性会得到一个漂亮的下拉列表,但没有任何工作,但作为 List on 公开的属性会获得 (Collection) 的值。当你点击 (Collection) 时,你会得到 Collection 编辑器,然后可以看到每个对象,以及它们各自的属性:
这不是我要找的。就像我在这篇文章中的第一个屏幕截图一样,我正在尝试将 List 的属性 Benchmark 集合呈现为一个下拉列表,该列表将对象的 name 属性显示为可以显示的文本...
谢谢
【问题讨论】:
标签: c# winforms propertygrid