2009-11-30 16 views
10

¿Es posible tener un DependencyProperty dentro de una clase derivada de MarkupExtension?DepedencyProperty dentro de una 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 utiliza 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 tal extensión o estoy ladrando en el árbol equivocado? (el código anterior no se compilará y ejecutará, pero lo publiqué aquí para ilustrar mejor el problema).

Respuesta

5

No, sólo se puede agregar propiedades de dependencia a las clases que se derivan de DependencyObject, MarkupExtention se deriva directamente del objeto

+0

En ese caso, ¿qué pasa con la extensión de marcado de enlace? Sus propiedades se pueden vincular por sí mismas, por lo que son propiedades de dependencia. – Narek

+0

@Narek: de acuerdo con MSDN, la extensión de marcado de enlace no tiene propiedades de dependencia, esto tiene sentido porque no puede implementar propiedades de dependencia sin llamar a DependencyObject.SetValue y DependencyObject.GetValue y no puede invocar aquellas sin heredar de DependencyObject. Además, no puedo probarlo ahora mismo, pero no creo que pueda usar el enlace en las propias propiedades de enlace, es decir, no puede hacerlo {Binding Converter = {Binding ...}} – Nir

+0

En realidad, no tengo cualquier experiencia en WPF, pero en Silverlight 5 definitivamente es posible usar el enlace en las propias propiedades de enlace. Aquí hay un ejemplo: "{Binding UserName, RelativeSource = {RelativeSource FindAncestor, AncestorType = UserControl}}". – Narek

0

sí .. Es un problema feo .. Sin embargo, tiene una respuesta simple y no intuitiva. Crea otra extensión de marcado para obtener el recurso estático. Así que en lugar de utilizar {StaticResource shapesDS}

Para ello se crea una nueva llamada MarkupExtension DataSetLocator

No voy a escribir el código, pero el valor Proporcionar tendría que devolver el conjunto de datos basado en un nombre o alguna otra entrada.

A continuación, cambiar su xaml tener su extensión usar el ejemplo de extensión de datos de localización Source="{DataSetLocator name=shapesDS }"

Es una lástima que las extensiones no se extienden DependencyProperty pero no lo hacen.

-1

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.

+6

WPF no tiene IMarkupExtension. – Brian

Cuestiones relacionadas