11

是否可以DependencyPropertyMarkupExtension派生类中有一个?

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>

甚至可以构建这样的扩展还是我只是在吠叫错误的树?(上面的代码不会编译和运行,但我在这里发布它以最好地说明问题)。

4

3 回答 3

5

不可以,只能将依赖属性添加到从 DependencyObject 派生的类中,MarkupExtention 是直接从 Object 派生的

于 2009-11-30T08:16:50.123 回答
0

是的..这是一个丑陋的问题..但是它有一个简单的非直观答案。创建另一个标记扩展来获取静态资源。所以而不是使用{StaticResource shapesDS}

您将创建一个名为的新 MarkupExtensionDataSetLocator

我不打算编写代码,但提供值需要根据名称或其他输入返回您的数据集。

然后你改变你的 xaml 让你的扩展使用数据集定位器扩展示例Source="{DataSetLocator name=shapesDS }"

扩展不扩展 DependencyProperty 但它们没有,这太糟糕了。

于 2010-07-23T16:18:42.170 回答
-1

只需使用 IMarkupExtension 而不是 MarkupExtension,您就可以扩展 DependencyObject。至少在 Silverlight 5 中你可以,但我认为 WPF 也有它。

于 2012-10-11T14:33:04.303 回答