Ответ 1
Нет, вы можете добавлять свойства зависимостей только к классам, производным от DependencyObject, MarkupExtention выводится непосредственно из Object
Возможно ли иметь 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>
Возможно ли построить такое расширение, или я просто подкрадываю неправильное дерево? (код выше не будет компилироваться и запускаться, но я разместил его здесь, чтобы лучше всего проиллюстрировать проблему).
Нет, вы можете добавлять свойства зависимостей только к классам, производным от DependencyObject, MarkupExtention выводится непосредственно из Object
Да... его уродливая проблема. Однако он имеет простой неинтуитивный ответ.
Создайте другое расширение разметки, чтобы получить статический ресурс.
Поэтому вместо использования {StaticResource shapesDS}
Вы создали бы новый MarkupExtension с именем DataSetLocator
Я не буду писать код, но значение Provide должно будет вернуть ваш набор данных на основе имени или другого ввода.
Затем вы меняете свой xaml, чтобы ваше расширение использовало пример расширения локатора набора данных Source="{DataSetLocator name=shapesDS }"
Слишком плохо, что расширения не расширяют DependencyProperty, но они не работают.
Просто используйте IMarkupExtension вместо MarkupExtension, и вы можете расширить DependencyObject. По крайней мере, в Silverlight 5 вы можете, но я бы предположил, что WPF также имеет его.