"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();
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Frage zu beantworten, warum das PropertyGrid-Steuerelement nicht ändern, werden in der MSDN-Dokumentation für die "PropertyGrid" - Steuerelement sagen:
So, es scheint, dass das "PropertyGrid" ist nicht eine Kontrolle, der automatisch aktualisiert werden kann. Ich denke, der Hinweis, dass das "PropertyGrid" - Steuerelement verwendet die
SelectedObject
- Methode anstelle einesDataSource
Methode, und letztere würde bedeuten, es hört wahrscheinlich INotifyPropertyChanged.Bist du Links mit dem, was LarsTech vorgeschlagen hat und das manuelle aktualisieren des Rasters.
Nur aktualisieren Sie:
Vorausgesetzt, Sie haben mehr Eigenschaften, die Sie verwenden können, Ihre
PropertyChanged
Veranstaltung. Ich würde ändern Sie Ihre Farbe Klasse wie folgt aus:Dann Ihre form würde so Aussehen:
Passiert über diese Frage versuchte sich zu erinnern, was ich verwendet, um zu verwenden und dachte, es könnte nützlich sein für andere.
Können Sie mit der [RefreshProperties] - Attribut-trigger aktualisiert die Eigenschaft Grid.
zB: