Gibt es eine Möglichkeit, eine WPF-Abhängigkeitseigenschaft zu entfernen?

8

Ich stoße in meinen Unit-Tests auf ein ungewöhnliches Problem. Die Klasse, die ich teste, erstellt zur Laufzeit dynamisch eine Abhängigkeitseigenschaft, und der Typ dieser Abhängigkeitseigenschaft kann abhängig von den Umständen variieren. Während ich meine Komponententests schreibe, muss ich die Abhängigkeitseigenschaft mit verschiedenen Typen erstellen, was zu Fehlern führt, weil Sie eine vorhandene Abhängigkeitseigenschaft nicht neu definieren können.

Gibt es also eine Möglichkeit, eine Abhängigkeitseigenschaft entweder zu entfernen oder den Typ einer vorhandenen Abhängigkeitseigenschaft zu ändern?

Danke!

Mit

OverrideMetadata () können Sie nur einige wenige Dinge wie den Standardwert ändern, was nicht hilfreich ist. Der AppDomain-Ansatz ist eine gute Idee und könnte funktionieren, scheint aber komplizierter zu sein, als ich wirklich eingehend testen wollte.

Ich habe nie eine Möglichkeit gefunden, eine Abhängigkeitseigenschaft aufzuheben, also habe ich meine Komponententests gestochen und sorgfältig reorganisiert, um das Problem zu vermeiden. Ich bekomme ein bisschen weniger Testabdeckung, aber da dieses Problem niemals in einer realen Anwendung auftreten würde und nur während des Komponententests, kann ich damit leben.

Danke für die Hilfe!

    
Scott Bussinger 28.09.2008, 21:35
quelle

6 Antworten

8

Ich hatte gerade gestern ein ähnliches Problem, als ich versuchte, meine eigene DependencyProperty-Erstellungsklasse zu testen. Ich bin auf diese Frage gestoßen und habe festgestellt, dass es keine echte Lösung für die Aufhebung der Registrierung von Abhängigkeitseigenschaften gibt. Also habe ich graben mit Red Gate .NET Reflektor um zu sehen, was ich mir vorstellen konnte.

>

Mit Blick auf die Überladungen DependencyProperty.Register schienen alle auf DependencyProperty.RegisterCommon zu zeigen. Diese Methode hat zwei Teile:

Zuerst prüfen Sie, ob die Eigenschaft bereits registriert ist

%Vor%

Zweitens, Registrieren der DependencyProperty

%Vor%

Beide Teile sind um DependencyProperty.PropertyFromName , eine HashTable, zentriert. Ich habe auch die DependencyProperty.RegisteredPropertyList und ItemStructList<DependencyProperty> bemerkt, aber nicht gesehen, wo sie benutzt wird. Aus Sicherheitsgründen dachte ich, dass ich versuchen würde, das auch zu entfernen.

Also habe ich den folgenden Code gefunden, mit dem ich eine Abhängigkeitseigenschaft "abmelden" konnte.

%Vor%

Es hat gut genug funktioniert, dass ich meine Tests ausführen konnte, ohne eine "AlreadyRegistered" -Ausnahme zu erhalten. Es wird jedoch dringend empfohlen, in keinem Produktionscode zu verwenden. Es gibt wahrscheinlich einen Grund dafür, dass MSFT keine formale Methode zur Aufhebung der Registrierung einer Abhängigkeitseigenschaft ausgewählt hat und versucht, dagegen vorzugehen es fragt nur nach Ärger.

    
statenjason 11.09.2009, 17:13
quelle
2

Wenn alles andere fehlschlägt, können Sie für jeden Test eine neue Anwendungsdomäne erstellen.

    
David Schmitt 30.09.2008 15:52
quelle
0

Ich glaube nicht, dass Sie eine Abhängigkeitseigenschaft abmelden können, aber Sie können sie neu definieren, indem Sie die Metadaten wie folgt überschreiben:

%Vor%     
Micah 28.09.2008 21:52
quelle
0

Wenn wir den Namen für ein Label wie folgt registrieren:

%Vor%

Wir können den Namen einfach wieder aufheben, indem wir Folgendes verwenden:

%Vor%     
kAPIL dHAMIJA 14.06.2009 19:30
quelle
0

Ich stand vor einem Szenario, in dem ich ein benutzerdefiniertes Steuerelement erstellt habe, das von Selector erbt, das zwei ItemsSource-Eigenschaften haben soll: HorizontalItemsSource und VerticalItemsSource .

Ich verwende nicht einmal die ItemsControl-Eigenschaft und möchte nicht, dass der Benutzer darauf zugreifen kann.

Also lese ich statenjason's große Antwort , und es gab mir einen großen POV, wie man eine DP entfernt.
Mein Problem war jedoch, dass ich das ItemsSourceProperty member und das ItemsSource als Private Shadows ( private new in C #) deklarierte, konnte es zur Entwurfszeit nicht laden, da MyControlType.ItemsSourceProperty sich auf die beschattete Variable.
Auch wenn ich die oben erwähnte Schleife benutze ( foreach DictionaryEntry usw.), wurde eine Ausnahme ausgelöst, die besagt, dass sich die Sammlung während der Iteration geändert hat.

Daher kam ich zu einem etwas anderen Ansatz, bei dem die DependencyProperty zur Laufzeit hartcodiert referenziert wird und die Sammlung in das Array kopiert wird, so dass sie nicht verändert wird (VB.NET, sorry):

%Vor%

Wichtiger Hinweis: Der obige Code ist im gemeinsam genutzten Konstruktor des benutzerdefinierten Steuerelements enthalten, und ich muss nicht überprüfen, ob er registriert ist, da ich eine Unterklasse von Selector kenne Stellt das ItemsSource dp.

bereit     
Shimmy 24.11.2010 02:24
quelle
0

Es gab ein Problem mit einem ContentPresenter mit verschiedenen Datamplates, von denen einer eine DependencyProperty mit einem PropertyChangedCallback hatte Wenn der Inhalt von ContentPresenter in ein anderes DataTemplate geändert wurde, blieb der Rückruf bestehen.

Im Ereignis UserControls Unloaded habe ich Folgendes aufgerufen:

%Vor%

Das hat für mich funktioniert

    
Davy 09.02.2018 15:10
quelle

Tags und Links