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

5

我已经阅读了一些关于在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 的子列表。

开始编辑: 尝试这段代码,按照一些人的建议,我从第三个参数中删除了额外的元素。

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

现在我收到这个错误。我之前已经收到过这个错误并搜索了解决方法,但我认为这可能对我来说太通用了,以至于我无法弄清楚我到底做错了什么。
“System.ArgumentException”类型的未经处理的异常发生在System.Windows.Forms.dll中
附加信息:这会导致集合中的两个绑定将绑定到同一属性。
结束编辑
我开始认为我的方法存在根本性问题,因为我看到类似的代码,人们说它能工作,所以我希望有人告诉我我做错了什么。请注意,这是一个Windows表单问题,不是XAML。谢谢。
修复
很抱歉上次的编辑。事实证明,我先前曾尝试使用VS设计器手动将文本框链接到数据源。在去除该数据源后,一切都正常了。感谢您的帮助!

从第三个参数中删除实例的名称 - Fabio
2个回答

12

试试这个:

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

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

希望有所帮助。


谢谢您的回复。我尝试了这段代码,但现在出现了以下错误:在 System.Windows.Forms.dll 中发生了未处理的类型为 'System.ArgumentException' 的异常。额外信息:这会导致集合中的两个绑定绑定到相同的属性。 - Bill
解决了我上面列出的问题。原来我之前已经向文本框添加了一个数据源。一旦我从VS设计器中删除它,一切都正常工作了。 - Bill

1
确保你正在捕获更改:
textBox1.DataBindings.Add("Text", bookProperty[0], "bookTitle", true, DataSourceUpdateMode.OnPropertyChanged);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接