DepedencyProperty в пределах MarkupExtension

Возможно ли иметь DependencyProperty внутри производного класса 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
        }
    }
}

Расширение используется в следующем фрагменте.

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

Возможно ли построить такое расширение, или я просто подкрадываю неправильное дерево? (код выше не будет компилироваться и запускаться, но я разместил его здесь, чтобы лучше всего проиллюстрировать проблему).

Ответ 1

Нет, вы можете добавлять свойства зависимостей только к классам, производным от DependencyObject, MarkupExtention выводится непосредственно из Object

Ответ 2

Да... его уродливая проблема. Однако он имеет простой неинтуитивный ответ. Создайте другое расширение разметки, чтобы получить статический ресурс. Поэтому вместо использования {StaticResource shapesDS}

Вы создали бы новый MarkupExtension с именем DataSetLocator

Я не буду писать код, но значение Provide должно будет вернуть ваш набор данных на основе имени или другого ввода.

Затем вы меняете свой xaml, чтобы ваше расширение использовало пример расширения локатора набора данных Source="{DataSetLocator name=shapesDS }"

Слишком плохо, что расширения не расширяют DependencyProperty, но они не работают.

Ответ 3

Просто используйте IMarkupExtension вместо MarkupExtension, и вы можете расширить DependencyObject. По крайней мере, в Silverlight 5 вы можете, но я бы предположил, что WPF также имеет его.