【问题标题】:XAML classless attached propertiesXAML 无类附加属性
【发布时间】:2012-12-03 22:22:23
【问题描述】:

我在整个框架的几个类中都有几个附加属性。所有这些都使用XmlnsDefinitionAttribute 映射到单个xml 命名空间。我注意到,如果我声明其中一些附加属性而不引用类名(实际包含该属性的类,我会收到编译时错误:

The property 'XXX' does not exist in XML namespace 'YYY'

为了更好地解释,当我假设一个具有 IsFocused 附加属性的 FocusHelper 类时会发生这种情况,但尝试像这样在 XAML 中使用它:

<CheckBox my:IsFocused="true"/>.

请注意,我指定了 xml 命名空间(我已正确声明),但没有指定类名。

我的问题是:

有没有办法做到这一点?该错误提示我有一种方法可以定义properties inside namespaces directly。这甚至可能吗?

【问题讨论】:

    标签: wpf xaml dependency-properties


    【解决方案1】:

    这不是 XAML 问题,这是 C#“问题”。这意味着,您不能在 C# 中拥有“全局”属性。它必须在一个类中。

    C# 中没有“全局”概念。

    为了获得您想要的语法,您必须能够全局声明一个属性(即在类的上下文之外),而这在 C# 中是不可能的

    这就是为什么框架附加属性前面也有类名(Grid.Column、Canvas.Top)

    对于框架附加属性(Grid.Column、Canvas.Top 等),您不必指定命名空间,因为它们位于“默认”命名空间中

    xmlns=""
    

    相对于你的命名空间

    xmlns:my=""
    

    【讨论】:

    • 我明白这一点。但是,由于 CLR 和 XAML 之间的映射是由 XAML 解析器执行的,因此它是可能的。它能够通过使用程序集级属性将 xmlnses 转换为 CLR 命名空间。我只是好奇 WPF xaml 解析器中是否有某种功能可以实现这一点。
    • 翻译命名空间与它没有任何关系。现在解析器将如何处理 IsFocused 属性?您不能在 C# 中拥有松散的属性,期间。因此,虽然您是正确的,但解析器可以通过程序集属性将多个 CLR 命名空间映射到一个 XAML 命名空间,但它不会改变属性必须包含在类中这一事实。我想你在问两个不同的问题?或者我误解了你在问什么。
    • 与使用[XmlnsDefinition(...)] 映射CLR 命名空间的方式相同,我不知道您可以将[XmlnsProperty(...)] 应用于属性。这就是解析器如何知道字符串my:IsFocused 将映射到哪个属性的方式。非常适合 XAML 语法。
    • 我明白了,是的,不可能。我不同意这是“非常适合 XAML 语法”,这会使 IMO 感到困惑。如果没有拥有类限定符,就很难知道附加属性的来源。这会导致混乱。如果你真的想在语法上接近一些东西,你可以使用自定义标记扩展来完成这样的事情
    猜你喜欢
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多