2009-02-27 42 views
1

我有一個具有實現INotifyPropertyChanged的名稱和年齡屬性的person對象。我想把這個對象綁定到一個ASP.NET表單上,這樣'name'和'age'屬性就可以綁定到文本框上,當兩個地方(控件或對象中)發生更改時,另一個得到更新。如何獲取業務對象和UI控件以互相交談

我是否創建了一箇中介類,用於監聽每個文本框的更改事件和對象更改事件並處理它們之間的更新?什麼是最好的方法來做到這一點?

我不清楚如何獲得業務對象和用戶界面互相交談。

回答

2

我已經強調了這個確切的問題很多。

簡短的回答是,是的,一箇中間項目。

訣竅是不寫每個控件的任何代碼。您應該能夠在屏幕上放置一個GUI控件(可以或不需要代碼),然後通過通用綁定機制將您的業務邏輯綁定到它。

我已經定義了通過XML綁定,通過屬性文件,並通過不斷的陣列 - 有一百萬的方式...

你可能有寫每個綁定對象的類型代碼(列表框結合不同而不是文本控件),你可能不得不編寫驗證器(但是指定驗證器的參數以及驗證器綁定的控件也應該在數據中完成)

現在所有的說法,我會很驚訝如果一些數據驅動的自動綁定機制並不存在,微軟自從VB第一次出現以來一直存在(儘管它們的實現過去非常不靈活,我敢肯定它們會做一些事情現在就職)。

我非常堅持每個控件的代碼行數爲0,因爲我的工作通常涉及配置具有幾十頁控件的複雜設備。一個典型的客戶/服務器系統將有7(!)行代碼PER CONTROL只是爲了將數據從數據庫傳輸到服務器,到客戶端,再到屏幕並返回(這對於簡單的ole「啞」代碼來說是最小的沒有智能綁定技巧)。

0LOC /控制可能不是每個人都需要的,但這是一個很好的目標。

評論回覆: 我已經用Java手動完成了我的大部分工作,所以我不確定我能否對這些細節有太多的幫助。

尋找C#和綁定給了我this看起來很有前途,雖然它可能直接綁定到一個太多的IMO數據庫,它應該綁定到一個業務對象,但概念應該是相同的。首先創建綁定

一種方式是手工實例綁定對象......(請原諒我的Java)

TextControl textCtrl1=new TextControl("Name Goes Here"); 
new TextBinder(textCtrl1, personObject, nameField); 

在Java中,第二行變得棘手。當綁定到特定的字段時,您必須使用反射來查找personObject的該字段的setter和getter。在C#中,我認爲它應該更容易。

無論如何,活頁夾應將自己添加爲控件和對象的偵聽器,然後向前和向後轉發更改。

這有幫助嗎?

編輯2: 正如你所注意到的,最難的部分是注意你的財產何時更新。幸運的是,這是可選的。通常情況下,一旦設置了對象,就不需要更新組件(當我分發了可以互相更新的UI時,我必須處理幾次)。

所以,如果你認爲你的目標不會改變,在「綁定」必須做到以下幾點:

  • 從物業中獲得的價值,並將其設置在組件中。
  • 將自己添加爲組件的偵聽器。
  • 保存屬性/對象(如果可以操作屬性,則在此處設置。如果不是,則需要存儲對象和屬性名稱並使用反射)
  • 保留並等待「更新」事件來自你的組件。

當您從組件獲取更新時: - 將值存儲在屬性中。 - 您可能需要設置「更新」標誌或存儲原始文件,以便如果遍歷所有綁定組件,則可以確定是否需要保存更新/啓用「確定」按鈕。

現在,您的對象應該始終處於最新狀態。

當你建立一個形式,你可以把它放到你的所有控件綁定到一個集合,這樣就可以做一些其他的操作...

  • 「保存」操作可以調用每一個綁定控制並告訴它從控件複製到屬性,這樣你就不需要使用監聽器了。
  • 「重置」操作可以將所有控件重置爲其原始值。
  • 「測試」操作可以詢問每個控件是否已更新。 。等

這樣做的好處是,您希望添加的每個「操作」添加都很微不足道,但會自動影響整個用戶界面。

您可能還想要一個帶有抽象基礎「綁定」類的控件的小對象層次結構,然後爲每種類型的控件(文本字段,數字字段,日期,微調器,表格,下拉)認爲這就是它。

這可能很簡單,但快速獲得複雜性。嘗試使用文本字段,看看你能做什麼。一個簡單的文本綁定對象應該就像5行代碼,如果你可以在C#中傳遞「屬性」... ...

+0

謝謝比爾!你能指點我到哪裏我可以看到一些例子嗎? – GernBlandston 2009-02-27 19:34:08

0

好吧,完全單獨的答案。正如我告訴過你的,我並不是很熟悉C#技術,但從我聽說的情況來看,LINQ可能會爲你完成整個工作。

事實上,LINQ可能會做你正在做的事情。它在Java中不存在,所以這就是爲什麼我在另一個答案中給了你「手動」版本的原因。

本頁底部的評論:http://msdn.microsoft.com/en-us/library/z919e8tw.aspx暗指更好的方式。