如何将Winform文本框绑定到类属性?

时间:2016-01-29 00:20:15

标签: c# winforms 2-way-object-databinding

我已经阅读了一些关于Stack Overflow和其他地方的问题,这些问题描述了将一个文本框绑定到一个类,但是在编译时我甚至无法在没有收到VS的错误的情况下使基本工作正常工作。

(1)我想要完成的是从类中显示属性的文本。

(2)当用户修改该文本时,我希望该属性自动更新。

不幸的是,我甚至无法过去(1)。

班级:

class BookProperties : INotifyPropertyChanged
{

    private string _bookTitle;
    public string bookTitle { get { return _bookTitle; } set { SetField(ref _bookTitle, value, "bookTitle"); } }

    #region handle property changes

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
    protected bool SetField<T>(ref T field, T value, string propertyName)
    {
        if (EqualityComparer<T>.Default.Equals(field, value)) return false;
        field = value;
        OnPropertyChanged(propertyName);
        return true;
    }

    #endregion
}

班级初始化程序:

BindingList<BookProperties> bookProperty = new BindingList<BookProperties>();

与文本框的连接:

    textBox1.DataBindings.Clear();
    textBox1.DataBindings.Add("Text", bookProperty, "bookProperty.bookTitle");

我也试过这个:

    textBox1.DataBindings.Clear();
    textBox1.DataBindings.Add("Text", bookProperty, "bookProperty[0].bookTitle");

Visual Studio会引发以下错误:

  

无法创建字段bookProperty的子列表。

START EDIT :尝试使用此代码时,我会删除第三个参数中的其他元素,如同一些人建议的那样。

bookProperty.Add(new BookProperties(){bookTitle="C#"});
textBox1.DataBindings.Add("Text", bookProperty[0], "bookTitle");

现在,我收到此错误。我之前收到过它并搜索了一个解决方案,但我认为对我来说可能过于通用,无法确定我到底做错了什么。

  

发生了'System.ArgumentException'类型的未处理异常   System.Windows.Forms.dll中

     

附加信息:这会导致集合中的两个绑定   绑定到同一个属性。

结束编辑

我开始认为我的方法存在根本性的错误,因为我看到了人们说的类似代码,所以我希望有人可以告诉我我做错了什么。请注意,这是一个Windows窗体问题,而不是XAML。感谢。

固定 抱歉上次编辑。事实证明我之前尝试使用VS设计器手动将文本框链接到数据源。删除该数据源后,一切正常。谢谢你的帮助!

2 个答案:

答案 0 :(得分:4)

试试这个:

bookProperty.Add(new BookProperties(){bookTitle="C#"});
textBox1.DataBindings.Add("Text", bookProperty[0], "bookTitle");

第二个参数是应该显示的源,第三个参数是源类属性。还要确保bookProperty列表中有项目。

希望有所帮助。

答案 1 :(得分:0)

确保您正在捕获更改:

textBox1.DataBindings.Add("Text", bookProperty[0], "bookTitle", true, DataSourceUpdateMode.OnPropertyChanged);