quiero tomar un objeto, digamos que este objeto:lista de visualización de objetos personalizados como un menú desplegable en el PropertiesGrid
public class BenchmarkList
{
public string ListName { get; set; }
public IList<Benchmark> Benchmarks { get; set; }
}
y tienen ese objeto mostrar su ListName como la parte "nombre" de la PropertiesGrid ("punto de referencia" sería bueno), y para la parte "valor" de la PropertyGrid, tener una lista desplegable de la IList <> de Puntos de referencia:
aquí es el objeto de referencia
public class Benchmark
{
public int ID {get; set;}
public string Name { get; set; }
public Type Type { get; set; }
}
Me gustaría que el menú desplegable mostrara la propiedad Name del Benchmark para ver lo que los usuarios pueden ver. Aquí está un ejemplo visual:
Así que, esencialmente, estoy tratando de conseguir una colección de objetos de referencia en una lista desplegable, y esos objetos deben mostrar su propiedad Name como el valor en el desplegable.
He leído otros artículos sobre el uso de PropertiesGrid, incluidos THIS y THIS, pero son más complejos de lo que estoy tratando de hacer.
Suelo trabajar en cosas del lado del servidor, y no se ocupan de la interfaz de usuario a través de Web Forms o Windows Forms, por lo que este PropertiesGrid que realmente está conmigo a dar un paseo ...
Yo sé que mi solución radica en la implementación "ICustomTypeDescriptor", que me permitirá decirle a PropertiesGrid qué valores debería mostrar, independientemente de las propiedades del objeto al que quiero vincular la lista desplegable, pero no estoy seguro de cómo o dónde implementar eso.
Cualquier sugerencia/ayuda sería muy apreciada.
Gracias, Mike
ACTUALIZACIÓN:
bien, así que voy a cambiar los detalles de todo un poco. Ya me estaba excediendo con los objetos que pensé que deberían estar involucrados, así que este es mi nuevo enfoque.
Tengo un objeto llamado Analytic. Este es el objeto que debe estar vinculado a PropertiesGrid. Ahora, si expongo una propiedad que es de tipo enum, PropertiesGrid se encargará de la lista desplegable, lo cual es muy bueno. Si expongo una propiedad que es una colección de un tipo personalizado, PropertiesGrid no es tan agradable ...
Este es el código para la analítica, el objeto de deseo de unirse a la 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);
}
}
}
aquí está un ejemplo corto de dos objetos que implementan la interfaz 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;}
}
Estos dos objetos se añadirán a la colección de lista de referencia del objeto analítico en el código de Windows Forms:
private void Form1_Load(object sender, EventArgs e)
{
Analytic analytic = new Analytic();
analytic.AddBenchmark(new PrimaryBenchmark());
analytic.AddBenchmark(new Vehicle());
propertyGrid1.SelectedObject = analytic;
}
Aquí hay una captura de pantalla de la salida en PropertiesGrid.Tenga en cuenta que la propiedad expuesta como una enumeración obtiene una buena lista desplegable sin trabajo, pero la propiedad expuesta como Lista de obtiene un valor de (Cobro). Al hacer clic en (Colección), se obtiene el editor de la colección y luego se puede ver cada objeto, y sus respectivas propiedades:
Esto no es lo que estoy buscando. Al igual que en mi primera captura de pantalla en esta publicación, intento renderizar la propiedad Benchmark collection of List como una lista desplegable que muestra la propiedad del nombre del objeto como el texto de lo que se puede mostrar ...
Gracias
Simon, todo funciona genial! Entiendo la clase BenchmarkTypeConverter, pero la clase BenchmarkTypeEdit sigue siendo un misterio para mí. Parece que cada vez que hace clic en el menú desplegable, toda la lista debe reconstruirse y luego elegir el nuevo valor. Supongo que así es como PropertyGrid debe funcionar "detrás de escena", y es por eso que hacer algo que es muy directo puede llevar una buena cantidad de código. De cualquier manera, ¡muchas gracias por extender una mano amiga! Estoy mucho más avanzado que antes. ¡Algún buen Karma viene en tu camino! Mike –
Algunos otros recursos geniales para explicar lo que Simon hizo aquí. Otra vez Simon, ¡muchas gracias! http://msdn.microsoft.com/en-us/library/ms171839.aspx http://msdn.microsoft.com/en-us/library/ms171840.aspx –
Simon, has explicado muy bien el concepto y gracias por un ejemplo de trabajo muy bueno y simple :) ¡Salud! –