在Winform应用程序中的文本框数据绑定,我缺少什么

时间:2010-02-09 18:17:14

标签: c# winforms data-binding .net-3.5 user-controls

我正在尝试在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为我做的事情,还是我以某种方式搞砸了并且只实现了单向绑定?

1 个答案:

答案 0 :(得分:1)

tbxListPets.DataBindings.Add("Text",this, Pets);
//                                        ^^^^

不应该是:

tbxListPets.DataBindings.Add("Text", this, "Pets");
//                                         ^^^^^^

请注意原始代码中缺少的双引号。

您需要将属性的名称(将绑定到UI控件)指定为字符串。然后,WinForms将能够通过反射或TypeDescriptor机制检索该属性的值。

如果省略引号,则会尝试将UI控件绑定到名称等于当前值Pets的属性(这几乎绝对不是您想要的)。

另请参阅: ControlBindingsCollection.Add reference page on MSDN