Tengo una aplicación Winform que utiliza el color para resaltar ciertas cosas. Me gustaría permitir que los usuarios cambien 'sus' colores. Como ejercicio, pensé en crear una instancia de una clase, con propiedades para los colores, y asignarla a una cuadrícula de propiedades (para obtener un buen editor).¿PropertyGrid no nota las propiedades cambiadas en el código?
Esto parece funcionar bien, pero luego pensé que me gustaría dejar que los usuarios reiniciaran los colores (después de haber manipulado y configurado 20 tonos de beige). Entonces, agregué un botón "restablecer" a mi formulario, que establece las propiedades de color de mi objeto a los valores predeterminados.
Sin embargo, parece que si bien restablece las propiedades de mis objetos, la cuadrícula de propiedad no cambia. Si, después del reinicio, hago una cuadrícula de propiedad "Refresh", tiene el color de reinicio.
Supongo que la cuadrícula de propiedad no sabe que el objeto subyacente se ha cambiado?
¿Falta algo en este escenario, o debería simplemente aceptarlo y llamar al método Refresh cuando restablezco mi objeto?
Gracias
(pregunta muy similar here)
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.propertyGrid1.SelectedObject = new Colours();
}
private void button1_Click(object sender, EventArgs e)
{
Colours colours = this.propertyGrid1.SelectedObject as Colours;
colours.Reset();
}
}
public partial class Colours : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public Color ColourP1 { get; set; }
public void Reset()
{
this.ColourP1 = Color.Red;
var handler = this.PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs("ColourP1"));
}
}
A raíz de mi comentario de "no se suscribe a la INotifyPropertyChanged.PropertyChanged", ¿cuál es el inconveniente de subsclassing el control PropertyGrid para que lo haga?
public partial class MyPropertyGrid : System.Windows.Forms.PropertyGrid
{
private INotifyPropertyChanged _selectedObject;
protected override void OnSelectedObjectsChanged(EventArgs e)
{
base.OnSelectedObjectsChanged(e);
if (_selectedObject != null) _selectedObject.PropertyChanged -= selectedObject_PropertyChanged;
_selectedObject = this.SelectedObject as INotifyPropertyChanged;
if (_selectedObject != null) _selectedObject.PropertyChanged += selectedObject_PropertyChanged;
}
private void selectedObject_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
this.Refresh();
}
}
Sí, eso lo resume todo. – LarsTech