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).

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top