绑定通知
2025/4/23原创大约 1 分钟约 401 字
1. 定义属性
using System;
using System.ComponentModel;
namespace NotifyPropertyExample
{
public class Person : INotifyPropertyChanged
{
private string _name;
private int _age;
// 定义 Name 属性
public string Name
{
get => _name;
set
{
if (_name != value)
{
_name = value;
OnPropertyChanged(nameof(Name)); // 触发通知
}
}
}
// 定义 Age 属性
public int Age
{
get => _age;
set
{
if (_age != value)
{
_age = value;
OnPropertyChanged(nameof(Age)); // 触发通知
}
}
}
// 实现 INotifyPropertyChanged 接口
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
2. 使用属性
using System;
using System.Windows.Forms;
namespace NotifyPropertyExample
{
public partial class MainForm : Form
{
private Person _person;
public MainForm()
{
InitializeComponent();
// 初始化数据模型
_person = new Person { Name = "John Doe", Age = 30 };
// 绑定数据模型到控件
textBoxName.DataBindings.Add("Text", _person, "Name");
textBoxAge.DataBindings.Add("Text", _person, "Age");
// 按钮点击事件,修改数据模型
buttonUpdate.Click += ButtonUpdate_Click;
}
private void ButtonUpdate_Click(object sender, EventArgs e)
{
// 更新数据模型
_person.Name = "Jane Doe";
_person.Age = 25;
}
}
}
3. 注意事项
3.1. 双向绑定
- 在 WinForms 中,数据绑定是单向的(从数据源到控件)。如果需要双向绑定,需要手动处理控件的事件(如 TextChanged)来更新数据模型。
- 如果需要更强大的双向绑定功能,可以考虑使用 WPF。
3.2. 性能优化
- 如果有大量属性需要通知,可以使用 nameof 运算符避免硬编码属性名称。
- 避免频繁触发 PropertyChanged 事件,以免影响性能。
3.3. 线程安全
- 如果数据模型在后台线程中更新,需要确保 PropertyChanged 事件在 UI 线程上触发,以避免跨线程访问异常。