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
属性可以正常工作。你的代码中某个地方出了问题,破坏了它。你没有费心提供答案,所以不可能说你做错了什么。似乎名字有一个特殊的例子。不知道你为什么投票否决这个,我已经清楚地表明我是对的。