如何区分WinForm控件上的数据绑定和用户操作

时间:2008-10-15 02:19:28

标签: .net winforms data-binding

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

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

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

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

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

我一直在寻找,我想我只是没有想出正确的搜索条件来找到我正在寻找的东西。似乎数据绑定都非常精彩和漂亮,直到你需要用它做一些实用的东西,就像让两个绑定控件相互交互一样。似乎没有办法区分触发控制事件的内容。

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

有人有任何建议吗?

2 个答案:

答案 0 :(得分: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事件。

答案 1 :(得分:0)

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

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

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

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