C# WPF 附加属性 - 错误:“XML 命名空间中不存在该属性”

Posted

技术标签:

【中文标题】C# WPF 附加属性 - 错误:“XML 命名空间中不存在该属性”【英文标题】:C# WPF Attached Properties - Error: "The property does not exist in XML namespace" 【发布时间】:2013-03-02 20:56:09 【问题描述】:

我需要为现有的 WPF 控件(组框、文本框、复选框等)创建一个新属性,该属性将存储其访问级别,因此我找到了附加属性。 我以这个网站http://dotnetbyexample.blogspot.com.br/2010/05/attached-dependency-properties-for.html

为例

一切都很好,但是当我尝试在某些控件上使用它时出现以下错误...

错误 1 ​​XML 命名空间“clr-namespace:ImageGUI.App_Code;assembly=ImageGUI”中不存在属性“DependencyPropertiesHoster.AcessLevel”。第 131 行位置 97.ImageGUI\MainWindow.xaml 131 97 ImageGUI

这是我的 C# 代码 sn-p...

namespace ImageGUI.App_Code
    
    public static class DependencyPropertiesHoster
    
        //[AttachedPropertyBrowsableForChildren]
        public static readonly DependencyProperty AcessLevelProperty =
            DependencyProperty.RegisterAttached(
                "AcessLevel",
                typeof(EAcessLevel),
                typeof(DependencyPropertiesHoster),
                new PropertyMetadata(AcessLevelChanged)
            );

        // Called when Property is retrieved
        public static EAcessLevel GetAcessLevel(DependencyObject obj)
        
            if (obj != null)
                return (EAcessLevel)obj.GetValue(AcessLevelProperty);
            else
                return EAcessLevel.Client;
                //return obj.GetValue(AcessLevelProperty) as EAcessLevel;            
        

        // Called when Property is set
        public static void SetAcessLevel(DependencyObject obj, EAcessLevel value)
        
            obj.SetValue(AcessLevelProperty, value);
        

        // Called when property is changed
        private static void AcessLevelChanged(object sender, DependencyPropertyChangedEventArgs args)
        
            var attachedObject = sender as UIElement;
            if (attachedObject != null)
            
                // do whatever is necessary, for example
                // attachedObject.CallSomeMethod(                 
                // args.NewValue as TargetPropertyType);
            
        
    

这是我在窗口的声明

xmlns:CustomDepen="clr-namespace:ImageGUI.App_Code;assembly=ImageGUI"

这是我对该属性的使用(错误所在...)

<GroupBox Name="gbApplications" Header="DynamicResource applications" CustomDepen:DependencyPropertiesHoster.AcessLevel="Client">

观察:EAcessLevel 只是一个简单的枚举器。

提前致谢。

【问题讨论】:

您确定AcessLevel 在程序集ImageGUI 中吗?如果您删除声明中的assembly=ImageGUI 部分是否有效? +1 对于最终在 SO 问题中包含足够信息的人。要添加到@Bob 的评论中,如果您的附加属性(或其他)与您的 XAML 位于同一程序集中,则不应在 XML->CLR 命名空间映射中包含 assembly= 部分。 谢谢!我不敢相信它是如此简单,但我很高兴它是。只需移除末端部分即可修复它(装配=...)。但我想知道如何在代码中访问此属性?我现在如何以编程方式检索它?完美场景示例:EAcessLevel controlAcess = gbApplications.AcessLevel; @Luishg,请将其发布为您自己问题的答案 - 将答案与问题分开是一个好习惯(并防止此问题再次出现在未回答的问题列表中 - 作为奖金;)。 谢谢,搞定了。谢谢大家的帮助和建议。 【参考方案1】:

感谢 Bob 和 Kent 的回答,这几乎解决了这个问题。 在这种情况下,只需更改

xmlns:CustomDepen="clr-namespace:ImageGUI.App_Code;assembly=ImageGUI"

xmlns:CustomDepen="clr-namespace:ImageGUI.App_Code"

解决了这个问题。 其他一切都是正确的。

关于我关于如何检索指定值的其他评论,是这样的:

EAcessLevel currentAcess = (EAcessLevel)gbApplications.GetValue(DependencyPropertiesHoster.AcessLevelProperty);

谢谢,希望它对以后的人也有帮助。

【讨论】:

以上是关于C# WPF 附加属性 - 错误:“XML 命名空间中不存在该属性”的主要内容,如果未能解决你的问题,请参考以下文章

C# 英语纠错 LanguageTool

WPF属性附加属性

C# wpf 实现任意控件拖动

WPF 使用附加属性增加控件属性

WPF 精修篇 附加属性

WPF 依赖属性和附加属性