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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top