DepedencyProperty dans une MarkupExtension
-
10-07-2019 - |
Question
Est-il possible d'avoir un DependencyProperty
dans une classe dérivée MarkupExtension
?
public class GeometryQueryExtension : MarkupExtension
{
public XmlDataProvider Source { get; set; }
public string XPath { get; set; }
public static readonly DependencyProperty ArgumentProperty = DependencyProperty.RegisterAttached(
"Argument",
typeof(string),
typeof(GeometryQueryExtension)); // this wont work because GeometryQueryExtension is not a DependencyProperty
public string Argument
{
get
{
return (string)GetValue(ArgumentProperty); // this wont even compile because GeometryQueryExtension doesnt derive from a class which has GetValue
}
set
{
SetValue(ArgumentProperty,value);// this wont even compile because GeometryQueryExtension doesnt derive from a class which has SetValue
}
}
}
L'extension est utilisée dans l'extrait suivant.
<Label.Content>
<local:GeometryQueryExtension Source="{StaticResource shapesDS}">
<local:GeometryQueryExtension.XPath>
/Shapes/Geometry/{0}
</local:GeometryQueryExtension.XPath>
<local:GeometryQueryExtension.Argument>
<Binding XPath="Geometry"/> <!-- will throw exception when processing this bind -->
</local:GeometryQueryExtension.Argument>
</local:GeometryQueryExtension>
</Label.Content>
Est-il même possible de construire une telle extension ou suis-je en train d'aboyer le mauvais arbre? (le code ci-dessus ne sera pas compilé ni exécuté, mais je l’ai posté ici pour illustrer au mieux le problème).
La solution
Non, vous pouvez uniquement ajouter des propriétés de dépendance aux classes dérivées de DependencyObject. MarkupExtention est directement dérivé de Object
Autres conseils
Oui… c’est un problème très grave .. Cependant, il a une réponse simple et non intuitive.
Créez une autre extension de balisage pour obtenir la ressource statique.
Donc, au lieu d'utiliser {StaticResource ShapesDS}
Vous créez un nouveau MarkupExtension nommé DataSetLocator
Je ne vais pas écrire le code, mais la valeur Provide devrait renvoyer votre jeu de données en fonction d'un nom ou d'une autre entrée.
Vous modifiez ensuite votre xaml pour que votre extension utilise l'exemple d'extension de localisateur de jeu de données Source = "{DataSetLocator name = ShapeDS} "
C’est dommage que les extensions n’étendent pas DependencyProperty mais elles ne le font pas.
Utilisez simplement IMarkupExtension au lieu de MarkupExtension et vous pouvez étendre DependencyObject. Au moins dans Silverlight 5, vous le pouvez, mais je suppose que WPF l’a également.