/ / Comment remplacer une propriété de dépendance dans une classe générique? - c #, génériques, dépendances-propriétés

Comment redéfinir une propriété de dépendance dans une classe générique? - c #, génériques, dépendances-propriétés

Donc j'ai une classe; permet d'utiliser le ScrollViewer classe à titre d'exemple. Il a une propriété de dépendance appelée Content qui accepte n'importe quoi de type System.Object, génial!

Disons que je tire une classe de ScrollViewer, appelons ça ZoomScrollViewer, il ajoute quelques opérations de base de zoom et de panoramique à l’aide de la souris et d’une pression du clavier. Il ajoute également une propriété de dépendance de sa propre propriété, AutoscaleContent.

Maintenant, je veux pouvoir mettre un ZoomScrollViewer dans une fenêtre de l'interface utilisateur, mais je seulement veux accepter une toile en tant que contenu. Naturellement, je crée un ZoomScrollViewer<T> classe.

Cependant, comment puis-je modifier la propriété Content afin que seuls les éléments de type <T>? Puis-je remplacer la propriété de dépendance? Je me suis un peu perdu et j'ai essayé:

    public new T Content
{
get { return (T)base.Content; }
set { base.Content = value; }
}

Mais bien sûr, cela n'en fait plus une propriété de dépendance, de sorte que tout le code XAML échoue lorsque je configure les liaisons.

Edit: Il convient également de noter que j’ai jeté un œil à l’utilisation de:

ZoomScrollViewer.ContentProperty.OverrideMetadata(typeof(ZoomScrollControl2<T>), new PropertyMetadata(...?));

Pour voir si je peux faire quelque chose en utilisant cela, mais il semble que vous ne pouvez remplacer que la valeur par défaut, à moins que quelque chose ne me manque?

Mise à jour: j’ai maintenant essayé d’utiliser ce qui suit:

public class ZoomScrollControl2<T> : ZoomScrollViewer where T : FrameworkElement
{
static ZoomScrollControl2()
{
ContentProperty.OverrideMetadata(typeof(ZoomScrollControl2<T>), new FrameworkPropertyMetadata(typeof(ZoomScrollControl2<T>)));
}
}

public class CanvasZoomControl : ZoomScrollControl2<Canvas>
{
}

Ce que je pensais fonctionnerait, mais il semble toujours accepter un contenu de tout type.

Mise à jour: En bref, je ne sais pas si ce que je veux faire est possible, alors j’ai marqué la discussion comme étant la réponse, même si ce n’est pas une réponse en soi.

Réponses:

2 pour la réponse № 1

Je suggère d'essayer cette approche comme suggéré par ce Article MSDN.

Il devrait remplacez le type de référence afin que vous puissiez y faire référence à l'aide d'un type dérivé.

Dependency Property la visibilité n'est pas rendue explicite dans .NET Framework pour les types dérivés, car la recherche de la bonne propriété parmi l’arbre des types a un coût en termes de performances, et en considérant que nous utilisons DP sur la liaison de l'interface utilisateur, cela peut entraîner des problèmes de performances non souhaitables.