是否可以在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派生

其他提示

是啊..它<!>#8217;这是一个丑陋的问题..然而它有一个简单的非直观的答案。 创建另一个标记扩展以获取静态资源。 所以不要使用{StaticResource shapesDS}

您将创建一个名为DataSetLocator

的新MarkupExtension

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

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

<!>#8217;太糟糕了,扩展不能<!>#8217;扩展DependencyProperty但他们不会<!>#8217; t。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top