Ho un'applicazione Winform che usa il colore per evidenziare alcune cose. Vorrei consentire agli utenti di cambiare i "loro" colori. Come esercizio, ho pensato di creare un'istanza di una classe, con proprietà per i colori, e assegnarla a una griglia di proprietà (per ottenere un editor piacevole).PropertyGrid non rileva le proprietà modificate nel codice?
Questo sembra funzionare bene, ma ho poi pensato che mi piacerebbe consentire agli utenti di ripristinare i colori (dopo averli giocati e impostarli su 20 tonalità di beige). Così, ho aggiunto un pulsante "Ripristina" al mio modulo, che riporta le proprietà del colore del mio oggetto ai valori predefiniti.
Tuttavia, sembra che mentre si ripristinano le proprietà dell'oggetto, la griglia delle proprietà non cambia. Se, dopo il reset, faccio una griglia di proprietà "Aggiorna", ha il colore di reset.
Suppongo che la griglia delle proprietà non sappia che l'oggetto sottostante è stato modificato?
C'è qualcosa che manca in questo scenario, o dovrei semplicemente accettarlo e chiamare il metodo di aggiornamento quando resetto il mio oggetto?
Grazie
(domanda molto simile 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"));
}
}
seguito al mio commento di "nulla sottoscrive l'INotifyPropertyChanged.PropertyChanged", qual è lo svantaggio in subsclassing il controllo PropertyGrid in modo che lo faccia?
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ì, questo praticamente lo riassume. – LarsTech