为什么我在我的WPF用户控件上看到“成员未被识别或不可访问”错误?

29
我有一个自定义用户控件,其中有一个 public 属性,我希望能够在 XAML 中设置它。以下是代码:

TestControl.xaml

<UserControl x:Class="Scale.Controls.TestControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">

TestControl.xaml.cs

using System.Windows.Controls;

namespace MyProject.Controls
{
    public partial class TestControl : UserControl
    {
        public string TestMe { get; set; }
        public TestControl()
        {
            InitializeComponent();
        }
    }
}

然后,在我的MainWindow.xaml文件中,我尝试包含这个:

<controls:TestControl TestMe="asdf" />

然而,即使Visual Studio自动完成了TestMe属性,我仍然看到有波浪线的下划线,上面写着“成员“Test Me”未被识别或不可访问”,如下图所示。

成员"Test Me"未被识别或不可访问

我敢肯定我以前在其他项目中做过类似的事情。我该如何像这样通过XAML访问(即设置)公共属性?

8个回答

26

Visual Studio 2017

我曾经也遇到过同样的问题。它在某一天可以编译...但后来就不行了。我没有使用DependencyProperty,应该不需要用到它。属性会在Intellisense中出现,但插入时会给出相同的消息。我清理了、构建了、重新构建了、重启了VS、重新启动了电脑等等,都无济于事。

最后一搏...我移除了所有有问题的属性,并进行了干净的编译。然后我把它们放回去,它就编译成功了。我真的没有想到会这样。不知何故,VS被卡住了。


5
如果重建项目无效,请尝试将平台从AnyPC更改为x86或x64。这将解决该问题。 - Sonny D
这里也是一样的,就像@SonnyD所说的那样。无法解释,但它确实有效。 - Francesco B.

14

如果您正在使用VS2017,则尝试删除解决方案中所有项目的bin和obj文件夹,清理解决方案并重新构建。这对我有用!


4
对我来说,对这个解决方案进行简单的清理和构建就解决了问题。 - kad81

13

你需要将你的属性声明为依赖属性

namespace MyProject.Controls
{
    public partial class TestControl : UserControl
    {
        //Register Dependency Property

        public static readonly DependencyProperty TestMeDependency = DependencyProperty.Register("MyProperty", typeof(string), typeof(TestControl));

        public string MyCar
        {
            get
            {

                return (string)GetValue(TestMeDependency);

            }
            set
            {
                SetValue(TestMeDependency, value);
            }
        }

        public TestControl()
        {
            InitializeComponent();
        }
    }
}

一个示例如何做到这一点将是很棒的。 - soapergem
1
我认为您的项目应该按原样构建。只有当属性将成为绑定的目标时,才需要依赖属性。我刚刚测试了一个类似的场景,并按照您的问题所示进行了构建。不是很有用...但是可以构建。构建后,VS停止在我的机器上抱怨。 - user3230660
3
非常感谢@MoezRebai!这个方法完美解决了问题。需要注意的是,在我加入这段代码后,我必须重新构建项目才能消除错误。 - soapergem
1
错误仍然存在,尽管它编译得很好,但该属性没有任何作用。 - Krythic
如果他只是绑定到属性,那么他肯定只需要一个依赖属性。普通属性也可以正常工作。 - Murphybro2

12

将构建目标从 AnyCPU 改为 x86 或 x64。不确定为什么 AnyCPU 不起作用。


1
你是对的。我遇到了与上述类似的问题。重启VS,重新构建都没有帮助。将平台从AnyCPU更改为其他可以解决这个问题。 - Sonny D
真的没有道理,但它却有效! - Dr TJ
这对我似乎起作用了。我会在切换到x86并清理后添加它,然后VS显示了一个之前没有显示的C#编译错误。它与WPF无关(一个类没有覆盖一个抽象方法)。我认为这是根本原因。一旦修复了这个问题,我就切换回AnyCPU,一切都很好。不知道为什么一开始忽略了那个错误。 - StayOnTarget

4

我知道这有点晚了,但我在VS 2020上遇到了这个问题。

我尝试了上面列出的三个选项,包括CPU构建,但都没有起作用。

enter image description here

我最终不得不右键单击每个项目,进行清理和重建。然后问题就解决了...
这个问题仍然很烦人。

@Nasir 很棒,很高兴能帮到你。我更加烦恼的是你上个月刚遇到这个问题哈哈。 - iPhoenix_

2

在我的情况下,最初没有错误,在我修改了我的类之后,我的类中出现了一些错误,然后Xaml错误 member is not recognized 显示。解决了类中的错误后,我通过构建项目,所有项目都没有错误地构建完成,但是错误仍然显示在 Error List Window 中。最终,我重新启动了Visual Studio,错误消失了。


0
我在使用VS2022时遇到了这个问题,我只是移除了WindowsBase的引用,然后它就正常工作了。

-1

不需要为控件设置多个依赖属性,我会使用反射。

    public static readonly DependencyProperty UserControlProperty = DependencyProperty.Register("UserControl", 
typeof(object), typeof(CustomUserControl), new PropertyMetadata(null));

   public object UserControl
   {
            get { return GetValue(UserControlProperty); }
            set { SetValue(UserControlProperty, value); }
   }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接