1

我可能遗漏了一些明显的东西,但我只是没有看到。任何建议表示赞赏!

我的 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"); 
        } 
    }

谢谢!!!!

4

2 回答 2

1

谢谢你,第二杯咖啡……

这是一个解决方案,但有没有办法让它实时运行?(当用户键入时)以便他们可以更直接地以自己的方式看到错误?

此技术在验证后更新控件的显示(当焦点从控件移开时),

我使用 ComboBox.Validated 事件来触发控件从属性中重新读取其值。

添加:

comboBox_Speed.Validated += new EventHandler(comboBox_Speed_Validated);

和:

private void comboBox_Speed_Validated(object sender, System.EventArgs e)
{
   comboBox_Speed.DataBindings["Text"].ReadValue();
}
于 2013-10-31T17:21:45.197 回答
0

尝试 TextUpdate 事件。

comboBox_Speed.TextUpdate += new EventHandler(comboBox_Speed_TextUpdate);

void comboBox_Speed_TextUpdate(object sender, EventArgs e)
    {
        comboBox_Speed.DataBindings["Text"].WriteValue();
        comboBox_Speed.DataBindings["Text"].ReadValue();
    }
于 2013-10-31T18:52:35.737 回答