Pregunta

¿Es posible tener una DependencyProperty dentro de una clase derivada 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
        }
    }
}

La extensión se usa en el siguiente fragmento.

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

¿Es posible construir una extensión de este tipo o solo estoy ladrando el árbol equivocado? (el código anterior no se compilará ni se ejecutará, pero lo publiqué aquí para ilustrar mejor el problema).

¿Fue útil?

Solución

No, solo puede agregar propiedades de dependencia a clases derivadas de DependencyObject, MarkupExtention se deriva directamente de Object

Otros consejos

Sí ... es un problema feo ... Sin embargo, tiene una respuesta simple no intuitiva. Cree otra extensión de marcado para obtener el recurso estático. Entonces, en lugar de usar {StaticResource shapesDS}

Crearía una nueva MarkupExtension llamada DataSetLocator

No voy a escribir el código, pero el valor Provide debería devolver su conjunto de datos en función de un nombre o alguna otra entrada.

Luego cambia su xaml para que su extensión use el ejemplo de extensión del localizador de conjunto de datos Source = " {DataSetLocator name = shapesDS} "

Es una pena que las extensiones no extiendan DependencyProperty pero no lo hacen.

Simplemente use IMarkupExtension en lugar de MarkupExtension y puede extender DependencyObject. Al menos en Silverlight 5 puedes, pero supongo que WPF también lo tiene.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top