2009-06-15 52 views
0

我想驗證O/RM工具生成的類(單個實體或集合)是否與數據綁定兼容。O/RM工具中的數據綁定支持,如何檢測

我讀過WCF支持的數據綁定類型:一次,一種方式,兩種方式,一種方式從WCF源。但是,如何「老派」.NET 1.1數據綁定?

看起來有點難以檢查代碼中有什麼樣的數據綁定支持。您在運行時和設計時數據綁定支持方面也有所不同。在閱讀一些網頁時,我閱讀了不同類型的實現:實現IList,IComponent,INotifyPropertyChanged,IBindingList .... pffffff我不知道在哪裏尋找...

回答

2

你可以綁定到幾乎任何類。假設您創建了一個非常簡單的類,並帶有一些屬性,比如說名爲Person和Age的人。我正在談論一個簡單而簡單的課程,絕對沒有任何幻想。

如果您創建Person的實例,您可以使用它做幾件事情,並且我會假設您正在使用Windows窗體,但是這主要適用於其他框架: - 您可以將其屬性綁定到控件的屬性。 - 您可以將它綁定到數據網格,列表等。在前一種情況下,您可以設置哪些屬性綁定到哪些列的映射。在後者中,哪些屬性顯示在列表中,哪些屬性是用戶選擇的值。 - 更好的是,你可以將它綁定到一個bindingSource。

將單個實例綁定到網格或列表並沒有多大用處,所以通常要做的是創建一個實例列表並將其綁定到網格。更正確的是將列表綁定到綁定源,並將網格綁定到綁定源。

你可以看到關於如何做到這一點的好文章here

現在,關於您提到的所有接口,它們都只會爲數據綁定體驗增加更多價值。我們來談談其中的一些。

  • INotifyPropertyChanged。如果沒有實現這個接口,Person並不比任何其他對象少「可綁定」。然而,人們無法做的事情是通知控制他們的財產必然會被後者改變。試試這個:將Person實例的Name屬性綁定到TextBox的Text屬性。創建一個按鈕,單擊該按鈕可更改該實例的名稱的值。單擊按鈕後,您將看到TextBox不會更新。另一方面,如果您實現INotifyPropertyChanged並讓Name屬性的setter引發由接口定義的PropertyChangedEvent,則在重複該體驗之後,您將看到該文本框會自動更新。

  • IEnumerable。如果不是一個人,而是想將數據綁定到一組人員,則可以創建一個人員列表和數據綁定列表。舉個例子,List lst = new List(); DataGrid,bindingSource等數據綁定控件如何知道你想綁定到一組Person而不是綁定到lst本身的屬性?這是因爲List實現了IEnumerable。因此,無論何時將這些控件綁定到實現IEnumerable的任何實例時,控件都知道您打算不綁定列表的屬性,而是綁定到列表引用的實例。他們如何知道列表中包含的對象的類型?爲了更通用並支持任何類型的IEnumerable實現,他們只需檢查列表中第一個元素的類型,並假設所有其他元素是相同的。IBindingList:即使Person實現IPropertyChanged,如果將Person的實例組合到List中,將該列表分組綁定到控件,並通過代碼更改其中一個實例的屬性的值,您將看不到任何事情發生在屏幕上。發生這種情況是因爲Person正在通知,而不是綁定源,而是列表。但是這個清單並不是用於數據綁定的,所以它並沒有在聆聽,也沒有將事件傳播給控制。實現IBindingList的列表,比如BindingList,通過監聽其內容的PropertyChangedEvent事件並將它們傳播到數據綁定控件,可以提供更好的數據綁定支持。

我affraid我已經給了你無法確定對象是否是databoundable的方式,因爲幾乎所有的這些都是,但我希望我已經給你確定不同級別的數據綁定支持的一種方式(INotifyPropertyChanged的和IBindingList的)。我假設你知道如何通過反射來檢查這些。

1

具有屬性的類的任何實例都是數據可綁定的。 (實際上的任何類中的字段或屬性都可以綁定數據)

在.NET中使用反射使得在對象中發現/使用數據變得非常容易。 (性能價格比較低)

爲了回答這個問題您需要提供您遇到的具體使用場景。

Rui給出了一些很好的解釋,不同的常見的數據綁定模式,但他們每個都是爲了解決具體問題。

right答案總是依賴於上下文。

:)