如何将变量与DataTable中的DataRow绑定以实现自动更新?
如何让变量与DataRow自动同步?
直接把普通的string或int变量和DataRow绑定是不可行的——因为这些类型要么是值类型,要么是不可变的引用类型,完全没有属性变更通知的机制。当你修改变量值的时候,DataTable根本无从知晓发生了变化,自然没法自动同步。
不过我们可以通过一个简单的封装来实现这个需求:用一个实现了INotifyPropertyChanged接口的模型类来包装你的car和number,然后通过订阅变更事件来自动更新DataRow。
步骤1:创建带变更通知的模型类
首先定义一个包含Car和Number属性的类,实现INotifyPropertyChanged接口——这是.NET里实现属性变更通知的标准方式:
using System.ComponentModel; public class CarRecord : INotifyPropertyChanged { private string _car; private int _number; public string Car { get => _car; set { if (_car != value) { _car = value; OnPropertyChanged(nameof(Car)); } } } public int Number { get => _number; set { if (_number != value) { _number = value; OnPropertyChanged(nameof(Number)); } } } // 变更通知事件 public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
步骤2:关联模型与DataRow
接下来我们创建模型实例、DataTable和DataRow,然后订阅模型的PropertyChanged事件,当属性值变化时自动更新DataRow:
// 初始化模型和DataTable var carRecord = new CarRecord { Car = "cabrio", Number = 20 }; DataTable dt = new DataTable(); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Number", typeof(int)); var targetRow = dt.Rows.Add(carRecord.Car, carRecord.Number); // 订阅属性变更事件,自动同步到DataRow carRecord.PropertyChanged += (sender, args) => { switch (args.PropertyName) { case nameof(CarRecord.Car): targetRow["Name"] = carRecord.Car; break; case nameof(CarRecord.Number): targetRow["Number"] = carRecord.Number; break; } }; // 测试修改属性,DataRow会自动更新 carRecord.Car = "sedan"; carRecord.Number = 30; // 验证结果 Console.WriteLine(targetRow["Name"]); // 输出: sedan Console.WriteLine(targetRow["Number"]); // 输出: 30
可选:双向同步
如果需要反过来,当DataRow的值被修改时也同步回模型属性,可以订阅DataTable的ColumnChanged事件:
dt.ColumnChanged += (sender, args) => { if (args.Row == targetRow) { switch (args.Column.ColumnName) { case "Name": carRecord.Car = args.Row["Name"].ToString(); break; case "Number": carRecord.Number = (int)args.Row["Number"]; break; } } }; // 测试修改DataRow,模型属性也会更新 targetRow["Name"] = "suv"; Console.WriteLine(carRecord.Car); // 输出: suv
为什么这能工作?
INotifyPropertyChanged接口让模型类在属性值变化时触发PropertyChanged事件,我们通过订阅这个事件,就能在第一时间把新值同步到DataRow里。这是.NET中实现数据绑定和自动同步的标准模式,不管是后台代码还是UI场景(比如WinForms/WPF)都适用。
内容的提问来源于stack exchange,提问作者Mateusz Warzyc
相关产品推荐
相关产品推荐

