【问题标题】:How do I discriminate between data binding and user actions on WinForm controls如何区分 WinForm 控件上的数据绑定和用户操作
【发布时间】:2008-10-15 02:19:28
【问题描述】:

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

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

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

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

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

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

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

大家有什么建议吗?

【问题讨论】:

    标签: .net winforms data-binding


    【解决方案1】:

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

    表格

    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 事件。

    【讨论】:

    • 我认为数据绑定仍然可能会导致问题,因为它更新得如此之多。但从我从 BindingComplete 事件的测试中看到的情况来看,这仍然可能有效。另外,它将规则放入数据模型中。我现在已经解决了这个问题,但如果可以的话,我会试试这个。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-04-17
      • 1970-01-01
      • 2011-09-03
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 2013-12-12
      相关资源
      最近更新 更多