Irgendeiner Weise zu un-register ein WPF-Abhängigkeitseigenschaft?
Ich bin in einem ungewöhnlichen problem in meinem unit-tests. Die Klasse, die ich Teste, schafft eine Abhängigkeit, die Eigenschaft dynamisch zur Laufzeit und die Art der Abhängigkeit Eigenschaft kann je nach den Umständen. Während des Schreibens meine unit-tests, ich muss eine Abhängigkeitseigenschaft mit verschiedenen Arten und das führt zu Fehlern, da kann man nicht neu definieren, eine vorhandene Abhängigkeit Eigenschaft.
So ist es eine Möglichkeit, entweder un-registrieren einer Abhängigkeitseigenschaft oder ändern Sie den Typ eines bestehenden Abhängigkeit Eigenschaft?
Dank!
OverrideMetadata() können Sie nur ändern, ein paar wenige Dinge wie Standard-Wert, so dass es nicht hilfreich. Die AppDomain-Ansatz ist eine gute Idee und könnte funktionieren, aber scheint komplizierter, als ich eigentlich wollte, sich in for the sake of-unit-Tests.
Ich habe nie einen Weg finden, um die Registrierung einer Abhängigkeitseigenschaft also ich Stakte und gezielt reorganisiert meine unit-tests um das Problem zu vermeiden. Ich bin immer ein bisschen weniger test-coverage, aber da würde dieses problem nie auftreten, in einer realen Anwendung und nur während der unit-Tests kann ich Leben.
Danke für die Hilfe!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte ähnliches Problem nur gestern, wenn Sie versuchen zu testen, meine eigenen DependencyProperty-Klasse erstellen. Ich kam in dieser Frage, und bemerkt, es war keine echte Lösung, um die Registrierung von abhängigkeitseigenschaften. Also ich habe einige Graben mit Red Gate .NET Reflector, um zu sehen, was ich tun konnte.
Blick auf die
DependencyProperty.Register
überlastungen, Sie alle Schienen darauf zuDependencyProperty.RegisterCommon
. Diese Methode hat zwei Teile:Zunächst zu prüfen, ob die Eigenschaft bereits registriert
Zweite, das Registrieren der DependencyProperty -
Beide Stücke drehen sich um
DependencyProperty.PropertyFromName
eine HashTable. Mir ist auch aufgefallen dasDependencyProperty.RegisteredPropertyList
eineItemStructList<DependencyProperty>
aber nicht gesehen haben, wo es verwendet wird. Jedoch, zur Sicherheit, ich dachte, ich würde versuchen, entfernen von, dass auch, wenn möglich.Damit ich die Wunde mit dem folgenden code, der mir erlaubt, "unregister" eine Abhängigkeitseigenschaft.
Funktionierte es gut genug für mich zu laufen meine tests ohne eine "AlreadyRegistered" Ausnahme. Allerdings empfehle ich dringend, dass Sie verwenden Sie nicht diese in irgendeiner Art und Produktion von code. Es ist wahrscheinlich ein Grund dafür, dass MSFT entschieden, nicht auf eine formelle Art und Weise, um die Registrierung einer Abhängigkeitseigenschaft, und versucht sich dagegen zu wehren, es ist nur ärger bringen.
Wenn alles andere fehlschlägt, können Sie eine neue Anwendungsdomäne für jeden Test.
Ich glaube nicht, dass Sie können un-registrieren einer Abhängigkeitseigenschaft, sondern Sie neu definieren können Sie durch überschreiben der Metadaten wie dieser:
Wenn wir registrieren, name für ein Label, wie diese :
Können wir leicht aufheben der Registrierung den Namen :
Ich Stand vor dem Szenario, in dem ich ein benutzerdefiniertes Steuerelement erstellt, das erbt von
Selector
denen soll müssen zwei ItemsSource EigenschaftenHorizontalItemsSource
undVerticalItemsSource
.Ich nicht einmal die ItemsControl-Eigenschaft, und nicht möchten, dass der Benutzer in der Lage sein, darauf zuzugreifen.
Also ich lese statenjason tolle Antwort, und es gab mir einen großen POV, wie zu entfernen ein DP.
Aber mein problem war, dass ich da erklärt der
ItemsSourceProperty
Mitglied und dieItemsSource
alsPrivate Shadows
(private new
in C#), ich konnte nicht laden Sie zur design-Zeit, da mitMyControlType.ItemsSourceProperty
würde beziehen sich auf die beschattete variable.Auch, wenn Sie die Schleife erwähnt ist enswer oben (
foreach DictionaryEntry
etc.), Ich hatte eine exception geworfen, die sagen, dass die Sammlung hat sich während der iteration.Daher kam ich mit einem etwas anderen Ansatz, wo die DependencyProperty ist hardcodedly verwiesen zur Laufzeit, und die Sammlung kopiert array, so dass es nicht geändert (VB.NET, sorry):
Wichtiger Hinweis: der obige code ist alles eingebettet in das gemeinsame Konstruktor des benutzerdefinierten Steuerelements, und ich habe nicht zu prüfen, ob es registriert, weil ich weiß, dass eine sub-Klasse von Selcetor bietet, dass
ItemsSource
dp.Hatte ein Problem mit einem ContentPresenter mit verschiedenen Datatemplates, wo einer von Ihnen hatte eine DependencyProperty mit einem PropertyChangedCallback
Beim Wechsel ContentPresenters Inhalte zu einem anderen DataTemplate der Rückruf blieb.
In der Benutzersteuerelemente Entladen-Ereignis rief ich:
Das hat für mich