PropertyGrid bemerkt keine geänderten Eigenschaften im Code?

8

Ich habe eine Winform-Anwendung, die Farbe verwendet, um bestimmte Dinge hervorzuheben. Ich möchte den Benutzern erlauben, "ihre" Farben zu ändern. Als Übung dachte ich, ich würde eine Instanz einer Klasse mit Eigenschaften für die Farben erstellen und sie einem Eigenschaftsraster zuweisen (um einen netten Editor zu erhalten) .

Das scheint gut zu funktionieren, aber ich dachte mir, ich möchte den Benutzern erlauben, die Farben zurückzusetzen (nachdem sie geglättet und auf 20 Beigetöne gesetzt haben) . Also habe ich meinem Formular einen "Reset" -Button hinzugefügt, der die Farbeigenschaften meines Objekts auf die Standardwerte zurücksetzt.

Es scheint jedoch so zu sein, dass das Eigenschaftenraster nicht geändert wird, während es die Eigenschaften meines Objekts zurücksetzt. Wenn ich nach dem Zurücksetzen ein Eigenschaftsraster "Aktualisieren" mache, hat es die Farbe zurückgesetzt.

Ich nehme an, dass das Eigenschaftenraster nicht weiß, dass das zugrunde liegende Objekt geändert wurde?

Fehlt etwas in diesem Szenario, oder sollte ich es einfach akzeptieren und die Refresh-Methode aufrufen, wenn ich mein Objekt zurücksetze?

Danke

(sehr ähnliche Frage hier )

%Vor%

Nach meinem Kommentar zu "nichts abonniert die INotifyPropertyChanged.PropertyChanged" , was ist der Nachteil bei der Unterklasse der PropertyGrid-Steuerelement, so dass es tut?

%Vor%     
Black Light 10.04.2012, 15:56
quelle

3 Antworten

9

Um Ihre Frage zu beantworten, warum sich das PropertyGrid nicht ändert, lesen Sie die MSDN-Dokumentation für das PropertyGrid sag das:

  

Die im Raster angezeigte Information ist eine Momentaufnahme der Eigenschaften   Zu der Zeit ist das Objekt zugewiesen. Wenn ein Eigenschaftswert des Objekts   Die durch das SelectedObject angegebene Code wird zur Laufzeit im Code geändert   Ein neuer Wert wird erst angezeigt, wenn im Raster eine Aktion ausgeführt wird   bewirkt, dass das Raster aktualisiert wird.

Es scheint also, dass das PropertyGrid kein Steuerelement ist, das automatisch aktualisiert werden kann. Ich denke, der Hinweis darauf ist, dass das PropertyGrid die SelectedObject -Methode anstelle einer DataSource -Methode verwendet und die letztere würde bedeuten, dass es wahrscheinlich auf INotifyPropertyChanged hört.

Es bleibt Ihnen überlassen, was LarsTech vorgeschlagen hat und das Gitter manuell zu aktualisieren.

    
Brad Rem 12.04.2012, 19:08
quelle
6

Versuche es einfach zu aktualisieren:

%Vor%

Angenommen, Sie haben mehr Eigenschaften, können Sie Ihr PropertyChanged -Ereignis verwenden. Ich würde Ihre Color-Klasse wie folgt ändern:

%Vor%

Dann würde Ihr Formular wie folgt aussehen:

%Vor%     
LarsTech 10.04.2012 16:27
quelle
4

Es passierte bei dieser Frage, indem ich versuchte, mich daran zu erinnern, was ich früher benutzt hatte und dachte, es könnte anderen nützlich sein.

Sie können das Attribut [RefreshProperties] verwenden, um Aktualisierungen für das Eigenschaftsraster auszulösen.

zB:

%Vor%     
CooPzZ 26.10.2016 15:06
quelle