Grille de propriété n'est pas l'avis des propriétés changé dans le code?

J'ai un Winform application qui utilise la couleur pour mettre en évidence certaines choses. Je voudrais pour autoriser les utilisateurs à changer leurs couleurs. Comme exercice, j'ai pensé que je voudrais créer une instance d'une classe, avec des propriétés pour les couleurs, et de l'assigner à une propriété de la grille (pour obtenir un bon éditeur).

Cela semble fonctionner très bien, mais j'ai pensé que je voudrais permettre aux utilisateurs de réinitialiser les couleurs (ils ont trafiqué et de les fixer à 20 tons de beige). Donc, j'ai ajouté un bouton "reset" de mon formulaire, définissez les propriétés des couleurs de mon objet de revenir aux valeurs par défaut.

Cependant, il semble que, bien qu'il définit mon propriétés de l'objet en arrière, la grille des propriétés ne changent pas. Si, après la réinitialisation, je fais une propriété de la grille "Refresh", il a la réinitialisation de la couleur.

Je suis en supposant que la propriété de la grille ne sait pas que l'objet sous-jacent a été changé ?

Est qu'il manque quelque chose dans ce scénario, ou devrais-je juste l'accepter, et d'appeler la méthode Refresh quand j'ai réinitialiser mon objet ?

Grâce

(question très semblable ici)

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

À la suite de mon commentaire de "rien ne s'abonne à la INotifyPropertyChanged.PropertyChanged", ce qui est l'inconvénient dans subsclassing la grille des propriétés de contrôle de sorte qu'il n' ?

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

OriginalL'auteur Black Light | 2012-04-10