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
Vous devez vous connecter pour publier un commentaire.
Pour répondre à votre question sur les raisons de la grille de propriété ne change pas, la documentation MSDN pour la Grille de propriété dire ceci:
Donc, il semble que la grille de propriété n'est pas un contrôle automatique de la mise à jour. Je pense que l'idée est que la grille de propriété utilise le
SelectedObject
méthode au lieu d'unDataSource
méthode, et cette dernière impliquerait probablement qu'elle est à l'écoute de INotifyPropertyChanged.Vous êtes de gauche avec ce LarsTech l'a proposé et actualiser manuellement la grille.
OriginalL'auteur Brad Rem
Juste essayer de rafraîchir:
En supposant que vous avez plus de propriétés, vous pouvez utiliser votre
PropertyChanged
événement. Je voudrais modifier votre classe de Couleur comme ceci:Votre formulaire devrait ressembler à ceci:
OriginalL'auteur LarsTech
Qui s'est passé à travers cette Question en essayant de se rappeler ce que j'ai l'habitude d'utiliser et pensé qu'il pourrait être utile à d'autres.
Vous pouvez utiliser le bouton [RefreshProperties] Attribut pour déclencher les mises à jour de la Grille des propriétés.
par exemple:
OriginalL'auteur CooPzZ