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

本文关键字:绑定 属性 文本 Winform | 更新日期: 2023-09-27 18:32:19

我已经阅读了许多关于堆栈溢出和其他地方的问题,这些问题描述了将文本框绑定到类,但我似乎甚至无法在不收到 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.Add(new BookProperties(){bookTitle="C#"});
textBox1.DataBindings.Add("Text", bookProperty[0], "bookTitle");

现在,我收到此错误。我以前收到过它并寻找解决方案,但认为它可能太笼统了,无法弄清楚我到底做错了什么。

类型为"System.ArgumentException"的未处理异常发生在 System.Windows.Forms.dll

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

结束编辑

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

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

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

试试这个:

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

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

希望有帮助。

确保捕获更改:

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