DepedencyProperty dentro de um MarkupExtension
-
10-07-2019 - |
Pergunta
É possível ter um DependencyProperty
dentro de uma classe 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
}
}
}
A extensão é usada no trecho a seguir.
<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>
Será que é mesmo possível construir uma extensão tal ou estou apenas latindo para a árvore errada? (O código acima não vai compilar e executar, mas eu postei isso aqui para melhor ilustrar o problema).
Solução
Não, você só pode adicionar propriedades de dependência para as classes que são derivadas de DependencyObject, MarkupExtention é derivado diretamente do objeto
Outras dicas
Sim .. é um problema feio .. No entanto, tem uma resposta simples não intuitiva.
Crie outra extensão de marcação para obter o recurso estático.
Então, em vez de usar {StaticResource shapesDS}
Você criaria um novo MarkupExtension chamado DataSetLocator
Eu não vou escrever o código, mas o Fornecer valor seria necessário para retornar o conjunto de dados com base em um nome ou alguma outra entrada.
Então você mudar de xaml para ter sua extensão usar o exemplo de extensão dataset localizador Source="{DataSetLocator name=shapesDS }"
É muito ruim que as extensões não se estendem DependencyProperty, mas eles não.
Apenas uso IMarkupExtension vez de MarkupExtension e você pode estender DependencyObject. Pelo menos em Silverlight 5 você pode, mas eu diria WPF também tem isso.