我正在尝试在WinForm应用程序中运行的用户控件中实现一些非常简单的数据绑定。用户控件的扩展方式如下 - >
public partial class ucDiagnosis : XtraUserControl, INotifyPropertyChanged
然后在该用户控件上我有这个属性 - >
private string m_Pets;
public string Pets
{
get
{
return m_Pets;
}
set
{
if (value != this.m_Pets)
{
this.m_Pets = value;
NotifyPropertyChanged("Pets");
}
}
}
然后在构造函数中我有了这个 - >
tbxListPets.DataBindings.Add("Text",this, Pets);
接下来,我在我的活动区域中有这个 - >
public event PropertyChangedEventHandler PropertyChanged;
接下来我有这个方法 - >
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
最后,在我的方法中将数据加载到控件中我有这个 - >
var additionalDiagnosis = BLLMcp.GetPlanDiagnosisAddtional(planID);
Pets = additionalDiagnosis.Rows[0]["Pets"].ToString();
程序运行但文本框保持为空。无论我输入什么内容,它都会立即清除。此外,我在Setter上设置了一个断点,它在初始加载时被调用,并且具有分配给值的正确数据,但它不会更新文本框。此外,无论我在盒子里输入什么内容,Setter都不会再被调用。
所以我似乎已经开始工作,但我很困惑,如果它真的如此。我只是在我的LoadData()方法中添加了另外两行 - >
tbxListPets.Text = addtionalDiagnosis.Pets;
为什么我必须在设置Property后显式设置TextBox?这不是Data Binding为我做的事情,还是我以某种方式搞砸了并且只实现了单向绑定?
答案 0 :(得分:1)
tbxListPets.DataBindings.Add("Text",this, Pets);
// ^^^^
不应该是:
tbxListPets.DataBindings.Add("Text", this, "Pets");
// ^^^^^^
请注意原始代码中缺少的双引号。
您需要将属性的名称(将绑定到UI控件)指定为字符串。然后,WinForms将能够通过反射或TypeDescriptor
机制检索该属性的值。
如果省略引号,则会尝试将UI控件绑定到名称等于当前值Pets
的属性(这几乎绝对不是您想要的)。