2008-10-29 85 views
0

我最近使用了一個令人驚歎的應用程序。從他們自己的類和「表單」繼承而來的所有表單都帶有驚人數量的功能,並且看起來像是堅果。雙向數據綁定對象

我感興趣的是這種形式的'功能'。這是一個C#WinForms項目,讓我失望了。

表單被綁定到該組寫入的對象以支持雙向數據綁定(在某種程度上)。他們的行爲方式非常簡單:

數據輸入表單都具有從文本框繼承的控件,並且這些控件都綁定到對象的屬性,輸入數據立即進行驗證,並且如果驗證失敗,則框爲淡粉色,並且a如果它通過,則呈淡綠色。如果盒子變成藍色,這實際上意味着表單所綁定的數據庫中的值已更改,並且在輸入有效值時立即保存對控件的更改。有時在保存發生之前有時需要填充一部分控件。但它全是自動的。你可以在任何時候停下來,稍後再回來繼續,而不需要真正保存自己。

而且就像我說如果別人正在編輯相同的記錄值,他們改變導致您的文本框變爲藍色,你知道你需要重新加載屏幕以查看最新的信息。

所有這些都來自於他們自己編寫的窗體類以及綁定到對象屬性的自己的文本框控件。

我主要想知道如何讓對象找出價值已被其他人改變。它肯定不輪詢數據庫。這個系統很棒。輝煌並沒有停止在那裏。

爲簡單起見。我該如何創建一個對象或一組對象來模仿這個行爲。我不會去,但我什至不知道如何。

感謝

回答

1

我敢肯定,任何涉及其他人的改變會需要打的數據庫。對於雙向綁定,您需要的所有真實都需要更改通知 - 即INotifyPropertyChanged(或每個Foo屬性的FooChanged事件)。這全部抽象爲TypeDescriptor - 即使用常規的PropertyDescriptor實現(它應該)將通過SupportsChangeEvents,AddValueChangedRemoveValueChanged知道的通知的任何綁定。

驗證 - IDataErrorInfo是你的朋友;通過執行此操作,您可以自願提供驗證信息(由多個控件使用並顯示,如DataGridView)。即

IDataErrorInfo dei = obj as IDataErrorInfo; 
if(dei != null) { // supports validation 
    string err = dei["PropName"]; // or .Error for overall status 
    bool clean = string.IsNullOrEmpty(err); 
} 

注意,可替換的方法將是對數據aobject一個Color屬性,並結合其直接向文本框等