你可以綁定到幾乎任何類。假設您創建了一個非常簡單的類,並帶有一些屬性,比如說名爲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的)。我假設你知道如何通過反射來檢查這些。