WinForms DateTimePicker绑定DateTime属性抛出ArgumentException异常
故障原因
WinForms 数据绑定的核心规则是:仅支持绑定数据源的公共实例属性,不支持绑定公共字段。
你代码中myClass定义的myDate是公共字段,而非属性,这就是抛出System.ArgumentException提示无法绑定到myDate成员的直接原因。
你提到同一窗体的文本框用相同绑定写法可正常运行,本质是那些文本框绑定的数据源成员都是公共属性,和控件类型无关;你测试的绑定myObj.myDate的Date成员不抛异常,也是因为Date是DateTime类型的公共属性,只是该属性无set访问器,仅支持单向绑定,无法满足双向编辑需求。
修复方法
无需修改控件侧的绑定代码,仅需要把myClass中的公共字段改写为公共属性即可:
public class myClass : myOtherClass { // 将原公共字段改为自动实现的公共属性 public DateTime myDate { get; set; } // 其余类成员保持不变 public myClass() { // 原有初始化逻辑不变 myDate = DateTime.Today; } }
修改后重新运行即可实现DateTimePicker和myDate属性的双向绑定。
可选优化:实现属性变更自动同步
如果需要后续在业务逻辑中修改myDate值时,DateTimePicker能自动刷新显示最新值,可以让myClass实现INotifyPropertyChanged接口,在属性值变更时主动发出通知:
using System.ComponentModel; using System.Runtime.CompilerServices; public class myClass : myOtherClass, INotifyPropertyChanged { private DateTime _myDate; public DateTime myDate { get => _myDate; set { if (_myDate == value) return; _myDate = value; OnPropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } public myClass() { myDate = DateTime.Today; // 其余初始化逻辑保持不变 } }
内容的提问来源于stack exchange,提问作者PGmath
相关产品推荐
相关产品推荐

