DepedencyProperty в пределах MarkupExtension - PullRequest
11 голосов
/ 30 ноября 2009

Возможно ли иметь 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>

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

Ответы [ 3 ]

5 голосов
/ 30 ноября 2009

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

0 голосов
/ 11 октября 2012

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

0 голосов
/ 23 июля 2010

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

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

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

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

Очень плохо, что расширения не расширяют DependencyProperty, но не расширяют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...