Domanda

È possibile avere un DependencyProperty all'interno di una classe derivata 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'estensione è utilizzata nel seguente frammento.

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

È anche possibile costruire una simile estensione o sto solo abbaiando sull'albero sbagliato? (il codice sopra non verrà compilato ed eseguito, ma l'ho pubblicato qui per illustrare meglio il problema).

È stato utile?

Soluzione

No, puoi solo aggiungere proprietà di dipendenza alle classi derivate da DependencyObject, MarkupExtention è derivato direttamente dall'oggetto

Altri suggerimenti

Sì .. è un brutto problema .. Tuttavia ha una risposta semplice e non intuitiva. Crea un'altra estensione di markup per ottenere la risorsa statica. Quindi invece di usare {StaticResource shapesDS}

Dovresti creare un nuovo MarkupExtension chiamato DataSetLocator

Non scriverò il codice ma il valore Fornire dovrebbe restituire il set di dati in base a un nome o ad altri input.

Quindi cambi il tuo xaml in modo che la tua estensione usi l'esempio di estensione del localizzatore del set di dati Source = " {DataSetLocator name = shapesDS} "

È un peccato che le estensioni non estendano DependencyProperty ma non lo fanno.

Usa semplicemente IMarkupExtension invece di MarkupExtension e puoi estendere DependencyObject. Almeno in Silverlight 5 puoi, ma suppongo che anche WPF ce l'abbia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top