我可能遗漏了一些明显的东西,但我只是没有看到。任何建议表示赞赏!
我的 DO(表示硬件设备的数据对象)中有一个属性,它绑定到我的表单中的控件(组合框,绑定“文本”属性)。如果用户键入无效值,我的属性的 Set{} 会拒绝更改并将相应的私有值设置为有效值。
如果控件读取公共属性,它将读取正确的值,但它没有这样做。它继续显示用户输入的无效值。
我认为我不能使用常规的数据绑定“验证”,因为它们在控件本身上工作,并且表单不知道值限制应该是什么(我错了吗?)。只有数据对象知道它的限制(可能会根据所选硬件设备的版本、所选的测量单位等而改变)。
我想我可以使用一个带掩码的文本框并将其最小/最大值绑定到数据对象中的另外两个属性,但这看起来很奇怪,我想使用组合框,以便用户可以选择常用值而不是总是输入。
在尝试更新 DO 属性后,如何让我的控件刷新其值?
通知:
comboBox_Speed.DataBindings.Add("Text", testProgramObject, "SpeedSetting", true, DataSourceUpdateMode.OnPropertyChanged);
comboBox_Speed.DataBindings["Text"].ControlUpdateMode = ControlUpdateMode.OnPropertyChanged;
comboBox_Speed.DataBindings["Text"].Format += new ConvertEventHandler(DeviceClass.DisplayInSelectedUnits);
comboBox_Speed.DataBindings["Text"].Parse += new ConvertEventHandler(DeviceClass.StoreInDatabaseUnits);
在数据对象中:
private UInt16 _speedSetting = 0;
public Double SpeedSetting{
get { return _speedSetting ; }
set
{
double temp = value; //databinding Parse function requires type Double for its destination.
try { _speedSetting = Convert.ToUInt16(temp); } // maybe user typed number too big for UInt16
catch
{
//_speedSetting= 0; // <-- Does not cause Control to display this value. It keeps invalid value.
SpeedSetting= 0; // <-- I thought this would trigger the control to read the changed value, but it doesn't.
}
NotifyPropertyChanged("SpeedSetting");
}
}
谢谢!!!!