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