【问题标题】:DepedencyProperty within a MarkupExtensionMarkupExtension 中的 DepedencyProperty
【发布时间】:2009-11-30 05:50:50
【问题描述】:

MarkupExtension 派生类中是否可以有DependencyProperty

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

扩展名用在后面的sn-p中

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

是否有可能构建这样的扩展或者我只是在吠叫错误的树? (上面的代码不会编译和运行,但我把它贴在这里最能说明问题)。

【问题讨论】:

    标签: wpf binding c#-3.0 dependency-properties markup-extensions


    【解决方案1】:

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

    【讨论】:

    • 在这种情况下,绑定标记扩展呢?它的属性可以自己绑定,所以它们是依赖属性。
    • @Narek - 根据 MSDN,绑定标记扩展没有依赖属性,这是有道理的,因为如果不调用 DependencyObject.SetValue 和 DependencyObject.GetValue 就无法实现依赖属性并且不能调用那些没有从 DependencyObject 继承的。另外,我现在无法对其进行测试,但我认为您不能对绑定自己的属性使用绑定,也就是说您不能这样做 {Binding Converter={Binding ...}}
    • 其实我对 WPF 没有任何经验,但是在 Silverlight 5 中,绝对可以在绑定自己的属性上使用绑定。这是一个示例:“{Binding UserName, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}”。
    • @Narek {RelativeSource} 不是数据绑定,它是一个不同的标记扩展,工作方式不同,可以在非依赖属性上工作,{Binding} 只在依赖属性上工作,所以不起作用关于标记扩展
    • 你是对的,我错误地假设绑定标记扩展的属性应该是依赖属性,因为其他标记扩展应用在它们上。
    【解决方案2】:

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

    您将创建一个名为 DataSetLocator 的新 MarkupExtension

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • WPF 没有 IMarkupExtension。
      猜你喜欢
      • 2013-05-31
      • 2015-04-14
      • 2013-01-22
      • 1970-01-01
      • 2017-06-18
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多