.net - register - wpf usercontrol dependencyproperty




Un moyen de désinscrire une propriété de dépendance WPF? (4)

Je ne pense pas que vous pouvez désinscrire une propriété de dépendance, mais vous pouvez la redéfinir en remplaçant les métadonnées comme suit:

MyDependencyProperty.OverrideMetadata(typeof(MyNewType), 
                     new PropertyMetadata());

Je rencontre un problème inhabituel dans mes tests unitaires. La classe que je suis en train de tester crée dynamiquement une propriété de dépendance au moment de l'exécution et le type de cette propriété de dépendance peut varier en fonction des circonstances. Lors de l'écriture de mes tests unitaires, j'ai besoin de créer la propriété de dépendance avec différents types et cela conduit à des erreurs car vous ne pouvez pas redéfinir une propriété de dépendance existante.

Donc, est-il possible de désinscrire une propriété de dépendance ou de modifier le type d'une propriété de dépendance existante?

Merci!

OverrideMetadata () ne vous permet de modifier que très peu de choses comme la valeur par défaut, donc ce n'est pas utile. L'approche AppDomain est une bonne idée et pourrait fonctionner, mais semble plus compliquée que je voulais vraiment plonger dans l'intérêt des tests unitaires.

Je n'ai jamais trouvé le moyen de désinscrire une propriété de dépendance, j'ai donc réorganisé soigneusement mes tests unitaires pour éviter le problème. Je reçois un peu moins de couverture de test, mais comme ce problème ne se produira jamais dans une vraie application et seulement pendant les tests unitaires, je peux vivre avec.

Merci pour l'aide!


Si tout le reste échoue, vous pouvez créer un nouvel AppDomain pour chaque test.


Si nous enregistrons le nom d'une étiquette comme ceci:

Label myLabel = new Label();
this.RegisterName(myLabel.Name, myLabel);

Nous pouvons facilement annuler l'enregistrement du nom en utilisant:

this.UnregisterName(myLabel.Name);

Je faisais face à un scénario où j'ai créé un contrôle personnalisé qui hérite de Selector qui est censé avoir deux propriétés ItemsSource, HorizontalItemsSource et VerticalItemsSource .

Je n'utilise même pas la propriété ItemsControl et je ne veux pas que l'utilisateur puisse y accéder.

J'ai donc lu la bonne réponse de statenjason , et cela m'a donné un énorme POV sur la façon de supprimer un DP.
Cependant, mon problème était que depuis que j'ai déclaré le membre ItemsSourceProperty et le ItemsSource comme Private Shadows ( private new in C #), je ne pouvais pas le charger au moment du design car MyControlType.ItemsSourceProperty ferait référence à la variable MyControlType.ItemsSourceProperty .
En outre, lorsque vous utilisez la boucle mentionnée dans enswer ci-dessus ( foreach DictionaryEntry etc.), une exception a été émise indiquant que la collection a changé au cours de l'itération.

Par conséquent, je suis venu avec une approche légèrement différente où DependencyProperty est référencé en dur au moment de l'exécution, et la collection est copiée dans le tableau afin qu'il ne soit pas changé (VB.NET, désolé):

Dim dpType = GetType(DependencyProperty)
Dim bFlags = BindingFlags.NonPublic Or BindingFlags.Static

Dim FromName = 
  Function(name As String, ownerType As Type) DirectCast(dpType.GetMethod("FromName",
    bFlags).Invoke(Nothing, {name, ownerType}), DependencyProperty)

Dim PropertyFromName = DirectCast(dpType.GetField("PropertyFromName", bFlags).
  GetValue(Nothing), Hashtable)

Dim dp = FromName.Invoke("ItemsSource", GetType(DimensionalGrid))
Dim entries(PropertyFromName.Count - 1) As DictionaryEntry
PropertyFromName.CopyTo(entries, 0)
Dim entry = entries.Single(Function(e) e.Value Is dp)
PropertyFromName.Remove(entry.Key)

Note importante: le code ci-dessus est tout entouré dans le constructeur partagé du contrôle personnalisé, et je n'ai pas besoin de vérifier si c'est enregistré, car je sais qu'une sous-classe de Selcetor DOES fournit cette ItemsSource dp.







dependency-properties