C# 装订不';C中名为Name的属性不起作用#

C# 装订不';C中名为Name的属性不起作用#,c#,winforms,binding,C#,Winforms,Binding,我有一段代码将文本框绑定到对象属性,如下所示: txtCreator.DataBindings.Add("Text", this.Application, "Creator"); txtName.DataBindings.Add("Text", this.Application, "Name"); txtOrganization.DataBindings.Add("Text", this.Appl

我有一段代码将文本框绑定到对象属性,如下所示:

txtCreator.DataBindings.Add("Text", this.Application, "Creator");
txtName.DataBindings.Add("Text", this.Application, "Name");
txtOrganization.DataBindings.Add("Text", this.Application, "Organization");
txtGuid.DataBindings.Add("Text", this.Application, "UniqueID");
txtDescription.DataBindings.Add("Text", this.Application, "Description");
该类实现了INotifyPropertyChanged,但它们都与名为“Name”的类不同。无论我做什么,它都不会从UI绑定回对象。但是,如果我将属性名称更改为其他名称。e、 g

txtName.DataBindings.Add(“Text”、this.Application、“AnotherName”)

并更改属性名称,它第一次工作!!!对于名为Name的属性,是否有一些特殊情况意味着它无法工作。我克服了它,并让它运行起来,但它是疯狂的怪异

好的,我创建了一个独立的小例子来证明我的观点。下面是一个实现INotifyPropertyChanged的类:

class TestClass : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string _name;

    public string Name
    {
        get => _name;
        set
        {
            // Will never fire from binding
            _name = value;
            ValueUpdated();
        }
    }

    // This is here because a property called Name doesn't bind correctly. Absolutely INSANE!!!
    public string BindingName
    {
        get => _name;
        set
        {
            _name = value;
            ValueUpdated();
        }
    }

    protected void ValueUpdated([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

以下是表格代码:

public partial class Form1 : Form
{
    internal TestClass TestObject { get; set; }

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.TestObject = new TestClass();
        this.TestObject.Name = "Hello";

        // Name won't work
        txtName.DataBindings.Add("Text", this.TestObject, "Name");

        // Binding Name will
        //txtName.DataBindings.Add("Text", this.TestObject, "BindingName");
    }
}


使用代码原样,集合将永远不会在TestClass上名为Name的属性中激发,但是只需取消对使用BindingName属性的行的注释,集合就会激发。正如您所看到的,除了“Name”之外,任何东西都可以工作,而Name由于某种原因不能工作。

看起来我是对的,属性名为Name的特殊情况。

所有控件都有一个
Name
属性,包括表单。当您使用
Name
作为
dataMember
参数时,它会获取表单的名称。一点也不奇怪;一般来说,您应该避免使用C#关键字作为变量/属性名。@Sach:您的猜测是没有根据的。绑定的源对象是
this.Application
。所讨论的数据绑定只是使用该属性作为源。
dataMember
属性不会因为属性名是
“name”
而不是其他内容而任意为源选择其他对象。“名为name的属性是否有特殊情况”--不,没有。你在别的地方做错了什么。一个简单的示例演示了使用
DataBindings.Add()
TextBox.Text
属性绑定到对象的
Name
属性可以正常工作。你的代码中某个地方出了问题,破坏了它。你没有费心提供答案,所以不可能说你做错了什么。似乎名字有一个特殊的例子。不知道你为什么投票否决这个,我已经清楚地表明我是对的。