2008-10-15 90 views
2

我有什么必须是典型的catch-22问题。我有一个.NET WinForm控件,其中包含一个文本框和一个复选框。两个控件都是绑定到数据类实例上的属性的数据。该文本框用于价格,该复选框用于指示价格是价格覆盖。同样在数据类别上的是一个拥有该项目原始价格的属性。我如何区分WinForm控件上的数据绑定和用户操作

我想进行控制以遵守以下规则:

  • 当用户输入一个值到价格文本框,复选框被自动检查,以指示它们所覆盖的价格值
  • 当复选框未被选中,项目的价格恢复到原始价格。

当用户取消选中该复选框,事件处理程序测试的选中状态,且该商品的价格属性设置为原来的价格值。但是,价格数据是数据绑定的,绑定事件被触发,它更新了文本框的值,这会触发文本更改的事件处理程序,它会重新检查复选框。

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

我一直在寻找,我想我只是没有提出正确的搜索条件来找到我要找的东西。看起来,数据绑定是非常精彩而又漂亮的,直到你需要做一些实用的事情,比如让两个绑定的控件相互交互。似乎没有办法区分触发控制事件的方式。

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

任何人有任何建议吗?

回答

0

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

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

另一个想法是,你可以继承文本框等的文本框处理它自己的状态属性添加到您的自定义文本框。例如,它可以具有只读的IsOriginal属性。

我现在没有安装VS,所以我没有验证它,让我知道你是否想要一个例子。

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

+0

我在想数据绑定仍然可能会导致一个问题,因为它的更新如此之多。但是从我从BindingComplete事件的测试中看到的,这仍然可以工作。另外,它将规则放入数据模型中。我现在已经解决了这个问题,但如果可以的话,我会尝试。 – Peter 2008-10-16 12:16:26