2010-09-08 50 views
2

我之前沒有真正做過雙向綁定項目,所以這可能是一個簡單的問題。與UI怪癖的雙向綁定

我有一個業務對象與所有正確的接口(INotifyPropertyChanged等)。我通過BindingSource將名爲CPP的Int32屬性綁定到名爲txtCPP的文本框。規則規定如果CPP小於0,文本框應該是空白的,否則應該顯示一個值。

所以要做到這一點,我將屬性從Int32更改爲Int32? (可爲空),並且當CPP屬性的支持變量小於零時,我實際上返回null。

這實際上可以在UI中正常工作。當我想將業務對象保存到數據庫時,問題就出現了。外部方法使用業務對象,讀取其屬性(包括CPP)並將其保存到數據庫中。顯然,CPP不是-1,而是寫爲空。

我確信在做雙向綁定項目時我不是第一個提出這個問題的人。一個人如何以一種乾淨的方式處理這些問題,而不用像這樣的邊緣案例來污染表單代碼呢?

回答

3

這聽起來就好像你對盒子是空規則是一個UI規則,而不是數據規則(這樣的數據值真的是-1,它只是應顯示爲空白)。

如果是這種情況,我們將空白邏輯移動到UI中。所以,你的數據對象屬性返回一個int(並且它返回int的實際值),然後你可以在你的顯示器中進行變形。要做到這一點

一種方法是用格式化 - 你可以指定一個格式化你的數據綁定,或者您也可以勾上綁定的Format事件。

當然,你仍然需要決定當用戶輸入一個空白值到文本框做什麼...

這裏是一個非常簡單的頭腦例如,在數據綁定使用格式事件:

 

var binding = this.textBox1.DataBindings.Add("Text", MyObject, "AValue", true); 
binding.Format += (s, args) => 
    { 
     int i = (int)args.Value; 
     if (i <= 0) 
     args.Value = ""; 
    }; 
 
+0

我添加了一個formattingEnabled參數綁定設置,否則它不能正常工作。 – AngryHacker 2010-09-08 21:49:38

+0

真的嗎?只是好奇,你使用什麼版本的.net?實際上,在我發佈和運行之前,我在VS 2010/.net 4.0中運行了該代碼。奇怪的。 – JMarsch 2010-09-08 21:58:54