"PropertyGrid" - Steuerelement nicht bemerken Eigenschaften im code geändert?

Ich habe eine Winform-Anwendung, die verwendet Farbe, um die Hervorhebung bestimmter Dinge. Ich möchte damit die Benutzer zu ändern "Ihre" Farben. Als eine übung, dachte ich, ich würde erstellen Sie eine Instanz einer Klasse mit Eigenschaften für die Farben, und ordnen Sie Sie auf eine Eigenschaft grid (um einen netten editor).

Diese scheint zu funktionieren, aber ich dachte dann, dass ich möchte, um die Benutzer-reset der Farben (nachdem Sie fummelte und Sie zu 20 beige). So, ich habe eine "reset" - Taste, um meine form, die die Farbeigenschaften des Objekts wieder auf die Standardwerte zurückzusetzen.

Allerdings scheint es, dass, während es setzt meiner Eigenschaften des Objekts zurück, das eigenschaftenraster nicht ändern. Wenn, nach dem reset, ich habe eine Eigenschaft grid "Aktualisieren", es hat die Farbe zurücksetzen.

Gehe ich davon aus, dass die Eigenschaft grid nicht wissen, dass das zugrunde liegende Objekt wurde geändert ?

Gibt es etwas, was fehlt in diesem Szenario, oder sollte ich einfach akzeptieren, und rufen Sie die Refresh-Methode, wenn ich zurücksetzen mein Objekt ?

Dank

(sehr ähnliche Frage hier)

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"));
  }
}

Im Anschluss an meinen Kommentar von "nichts abonniert, die INotifyPropertyChanged.PropertyChanged", was ist der Nachteil in subsclassing das PropertyGrid-Steuerelement, so dass es funktioniert ?

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();
  }
}
InformationsquelleAutor Black Light | 2012-04-10
Schreibe einen Kommentar