当更改 属性 值 c# 时,WinForms 双向绑定不起作用
WinForms two way bindings don't work when change property value c#
我有这段代码,还有一个 TextBox 控件 txtTest。
public partial class Form1 : Form
{
public Test TestProperty { get; set; }
public Form1()
{
InitializeComponent();
TestProperty = new Test();
}
private void Form1_Load(object sender, EventArgs e)
{
TestProperty.Value = 15;
txtTest.DataBindings.Add("Text", TestProperty,
nameof(TestProperty.Value),false,
DataSourceUpdateMode.OnPropertyChanged); // textTest has value 15
TestProperty.Value = 10; // textTest has value 15
}
}
public class Test
{
public int Value { get; set; }
}
在表单加载时,我将值 15 分配给值 属性,之后我在文本 属性 上添加了对 txtTest 控件的绑定,现在我的控件显示 txtTest.Text =“15”。绑定后,我为我的值 属性 10 分配了新值。现在我的 txtTest 控件仍然显示值 15。如果我通过表单在我的文本框控件中输入例如 20,我在 属性 值中有值 20。
对于这种情况,为什么我的 txtTest.Text 属性 中没有值 10?
要支持 two-way 业务对象的数据绑定,您需要在对象中的数据更改时发出更改通知。为此,您可以使用以下任一选项:
您可以为您的 class 实施 INotifyPropertyChanged。 (✔ 首选)
或者您可以为您实施 [PropertyName]Changed 模式 属性;假设你有 XXXX 属性,那么你需要在你的 class.
中有 XXXXChanged 事件
要了解有关数据绑定和更改通知的更多信息,请查看以下文档:
- How to: Implement the INotifyPropertyChanged Interface
- How to: Apply the PropertyNameChanged Pattern
- Change Notification in Windows Forms Data Binding
您可以在以下文档中找到更有用的文档:
示例 - 实施 INotifyPropertyChanged
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
public class Customer : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
string firstName;
public string FirstName
{
get { return firstName; }
set {
if (value != firstName) {
firstName = value;
NotifyPropertyChanged();
}
}
}
string lastName;
public string LastName
{
get { return lastName; }
set {
if (value != lastName) {
lastName = value;
NotifyPropertyChanged();
}
}
}
}
示例 2 - 应用 [PropertyName]已更改 模式
using System;
public class Customer
{
public event EventHandler FirstNameChanged;
public event EventHandler LastNameChanged;
protected void OnFirstNameChanged(EventArgs e)
{
FirstNameChanged?.Invoke(this, e);
}
protected void OnLastNameChanged(EventArgs e)
{
LastNameChanged?.Invoke(this, e);
}
string firstName;
public string FirstName
{
get { return firstName; }
set {
if (value != firstName) {
firstName = value;
OnFirstNameChanged(EventArgs.Empty);
}
}
}
string lastName;
public string LastName
{
get { return lastName; }
set {
if (value != lastName){
lastName = value;
OnLastNameChanged(EventArgs.Empty);
}
}
}
}
我有这段代码,还有一个 TextBox 控件 txtTest。
public partial class Form1 : Form
{
public Test TestProperty { get; set; }
public Form1()
{
InitializeComponent();
TestProperty = new Test();
}
private void Form1_Load(object sender, EventArgs e)
{
TestProperty.Value = 15;
txtTest.DataBindings.Add("Text", TestProperty,
nameof(TestProperty.Value),false,
DataSourceUpdateMode.OnPropertyChanged); // textTest has value 15
TestProperty.Value = 10; // textTest has value 15
}
}
public class Test
{
public int Value { get; set; }
}
在表单加载时,我将值 15 分配给值 属性,之后我在文本 属性 上添加了对 txtTest 控件的绑定,现在我的控件显示 txtTest.Text =“15”。绑定后,我为我的值 属性 10 分配了新值。现在我的 txtTest 控件仍然显示值 15。如果我通过表单在我的文本框控件中输入例如 20,我在 属性 值中有值 20。
对于这种情况,为什么我的 txtTest.Text 属性 中没有值 10?
要支持 two-way 业务对象的数据绑定,您需要在对象中的数据更改时发出更改通知。为此,您可以使用以下任一选项:
您可以为您的 class 实施 INotifyPropertyChanged。 (✔ 首选)
或者您可以为您实施 [PropertyName]Changed 模式 属性;假设你有 XXXX 属性,那么你需要在你的 class.
中有 XXXXChanged 事件
要了解有关数据绑定和更改通知的更多信息,请查看以下文档:
- How to: Implement the INotifyPropertyChanged Interface
- How to: Apply the PropertyNameChanged Pattern
- Change Notification in Windows Forms Data Binding
您可以在以下文档中找到更有用的文档:
示例 - 实施 INotifyPropertyChanged
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
public class Customer : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
string firstName;
public string FirstName
{
get { return firstName; }
set {
if (value != firstName) {
firstName = value;
NotifyPropertyChanged();
}
}
}
string lastName;
public string LastName
{
get { return lastName; }
set {
if (value != lastName) {
lastName = value;
NotifyPropertyChanged();
}
}
}
}
示例 2 - 应用 [PropertyName]已更改 模式
using System;
public class Customer
{
public event EventHandler FirstNameChanged;
public event EventHandler LastNameChanged;
protected void OnFirstNameChanged(EventArgs e)
{
FirstNameChanged?.Invoke(this, e);
}
protected void OnLastNameChanged(EventArgs e)
{
LastNameChanged?.Invoke(this, e);
}
string firstName;
public string FirstName
{
get { return firstName; }
set {
if (value != firstName) {
firstName = value;
OnFirstNameChanged(EventArgs.Empty);
}
}
}
string lastName;
public string LastName
{
get { return lastName; }
set {
if (value != lastName){
lastName = value;
OnLastNameChanged(EventArgs.Empty);
}
}
}
}