如何将 Winform 文本框绑定到 class 属性?
How can I bind a Winform textbox to a class property?
我已经阅读了关于 Stack Overflow 和其他地方的一些问题,这些问题描述了将文本框绑定到 class 但我似乎无法在编译时收到来自 VS 的错误的情况下进行基本操作。
(1) 我想要完成的是从 class.
显示 属性 的文本
(2) 当用户修改该文本时,我希望 属性 自动更新。
不幸的是我连 (1) 都过不了。
class:
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
}
class 初始值设定项:
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 抛出以下错误:
Child list for field bookProperty cannot be created.
开始编辑:尝试这段代码,我按照一些人的建议从第三个参数中删除了附加元素。
bookProperty.Add(new BookProperties(){bookTitle="C#"});
textBox1.DataBindings.Add("Text", bookProperty[0], "bookTitle");
现在,我收到此错误。我之前收到过它并搜索了一个解决方案,但我认为它可能太笼统了,无法弄清楚我到底做错了什么。
An unhandled exception of type 'System.ArgumentException' occurred in
System.Windows.Forms.dll
Additional information: This causes two bindings in the collection to
bind to the same property.
编辑结束
我开始认为我的方法存在一些根本性的错误,因为我看到了人们说有效的类似代码,所以我希望有人能告诉我我做错了什么。请注意,这是一个 Windows 表单问题,而不是 XAML。谢谢。
固定
对上次编辑感到抱歉。事实证明,我之前曾尝试使用 VS 设计器将文本框手动 link 到数据源。删除该数据源后,一切正常。感谢您的帮助!
试试这个:
bookProperty.Add(new BookProperties(){bookTitle="C#"});
textBox1.DataBindings.Add("Text", bookProperty[0], "bookTitle");
第二个参数是应该显示的来源,第三个参数是来源class 属性。还要确保 bookProperty 列表中有项目。
希望有所帮助。
确保您正在捕获更改:
textBox1.DataBindings.Add("Text", bookProperty[0], "bookTitle", true, DataSourceUpdateMode.OnPropertyChanged);
我已经阅读了关于 Stack Overflow 和其他地方的一些问题,这些问题描述了将文本框绑定到 class 但我似乎无法在编译时收到来自 VS 的错误的情况下进行基本操作。
(1) 我想要完成的是从 class.
显示 属性 的文本(2) 当用户修改该文本时,我希望 属性 自动更新。
不幸的是我连 (1) 都过不了。
class:
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
}
class 初始值设定项:
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 抛出以下错误:
Child list for field bookProperty cannot be created.
开始编辑:尝试这段代码,我按照一些人的建议从第三个参数中删除了附加元素。
bookProperty.Add(new BookProperties(){bookTitle="C#"});
textBox1.DataBindings.Add("Text", bookProperty[0], "bookTitle");
现在,我收到此错误。我之前收到过它并搜索了一个解决方案,但我认为它可能太笼统了,无法弄清楚我到底做错了什么。
An unhandled exception of type 'System.ArgumentException' occurred in System.Windows.Forms.dll
Additional information: This causes two bindings in the collection to bind to the same property.
编辑结束
我开始认为我的方法存在一些根本性的错误,因为我看到了人们说有效的类似代码,所以我希望有人能告诉我我做错了什么。请注意,这是一个 Windows 表单问题,而不是 XAML。谢谢。
固定 对上次编辑感到抱歉。事实证明,我之前曾尝试使用 VS 设计器将文本框手动 link 到数据源。删除该数据源后,一切正常。感谢您的帮助!
试试这个:
bookProperty.Add(new BookProperties(){bookTitle="C#"});
textBox1.DataBindings.Add("Text", bookProperty[0], "bookTitle");
第二个参数是应该显示的来源,第三个参数是来源class 属性。还要确保 bookProperty 列表中有项目。
希望有所帮助。
确保您正在捕获更改:
textBox1.DataBindings.Add("Text", bookProperty[0], "bookTitle", true, DataSourceUpdateMode.OnPropertyChanged);