2

我有一个典型的catch-22问题。我有一个包含文本框和复选框的 .NET WinForm 控件。这两个控件都是绑定到数据类实例上的属性的数据。文本框用于价格,复选框表示价格是价格覆盖。数据类上还有一个属性,用于保存商品的原始价格。

我希望控件遵守以下规则:

  • 当用户在价格文本框中输入值时,会自动选中复选框以指示他们正在覆盖价格值
  • 取消选中该复选框时,该项目的价格将恢复为原始价格。

当用户取消选中复选框时,事件处理程序测试选中状态,并将项目的价格属性设置为原始价格值。但是,价格值是数据绑定的,会触发一个绑定事件,该事件会更新文本框值,该值会触发文本更改事件处理程序,该处理程序重新检查复选框。

我试图捕获我明确更新会触发控件更改事件的内容的条件。但这仅适用于其中的一部分。文本框更改事件在我无法控制的其他时间触发,例如在最初显示表单时触发数据绑定。

我一直在四处寻找,我想我只是没有想出正确的搜索词来找到我正在寻找的东西。数据绑定似乎非常美妙,直到你需要用它做一些实际的事情,比如让两个绑定控件相互交互。似乎没有办法区分触发控制事件的原因。

我还查看了绑定源组件上可用的事件,但似乎没有任何更有用的东西。我可以处理绑定完成后触发的事件,但那是在问题发生之后。

有人有什么建议吗?

4

2 回答 2

4

我建议不要在表单代码中处理逻辑,而是在数据类中处理。您在表单中只需要几行来设置数据绑定。然后数据类可以处理其余部分:

形式

Private _dc As DataClass

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    _dc = New DataClass
    txtPrice.DataBindings.Add("text", _dc, "Price")
    chkOverride.DataBindings.Add("checked", _dc, "override")
End Sub

数据类

Private _originalPrice As Double = 50

Private _price As Double = _originalPrice
Public Property Price() As Double
    Get
        Return _price
    End Get
    Set(ByVal value As Double)
        If (_price <> value) Then
            _price = value
            Override = _price <> _originalPrice
        End If
    End Set
End Property


Private _override As Boolean
Public Property Override() As Boolean
    Get
        Return _override
    End Get
    Set(ByVal value As Boolean)
        If _override <> value Then
            _override = value
            If Not _override Then Price = OriginalPrice
        End If
    End Set
End Property

无需处理表单中的任何 CheckedChanged 或 TextChanged 事件。

于 2008-10-15T07:07:00.287 回答
0

您是否考虑过处理 TextBox TextChanged事件来处理 CheckBox 状态而不是绑定它?

然后,您可以将当前的 TextBox 值与原始值进行比较,并确定 CheckBox 是真还是假。

另一个想法是您可以继承 TextBox 并向您的自定义 TextBox 添加属性,以便 TextBox 处理它自己的状态。例如,它可以有一个只读的 IsOriginal 属性。

我现在没有安装VS,所以我没有验证它,如果你想要一个例子,请告诉我。

于 2008-10-15T03:00:29.130 回答