2008-10-15 89 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