2009-09-09 24 views
1

我有一個類以特定的方式實現屬性,以處理我們的業務邏輯系統的一些自定義需求。通過.NET中的某種接口使屬性可用於數據綁定?

這種「特定方式」使屬性在數據綁定的上下文中不可操作。基本上,如果我將類的對象放到表單上,數據綁定在對象上找不到任何東西,並且該對象的屬性檢查器雖然列出了屬性,但不允許我編輯它們。

我想知道的是,如果有一個接口或類似的東西,我可以在我的類中實現,它將向窗體設計器報告哪些屬性可以綁定到,並實現與數據綁定對話所需的自定義代碼系統代表我的屬性。

請注意,我不需要能夠在屬性檢查器中編輯我的對象的屬性值,這只是屬性的非功能性示例。我只需要數據綁定支持。

有沒有這樣的界面,如果有的話,它是什麼?

舉一個簡單的例子。

假設我有這個類:

public class CustomDataBinding : Component 
{ 
    private Dictionary<String, Object> _Properties = new Dictionary<String, Object>(); 

    public CustomDataBinding() 
    { 
     _Properties["Property1"] = 10; 
     _Properties["Property2"] = "Test"; 
    } 
} 

有什麼我可以做我的對象,短期實際進行性能,這將增加對那兩個「屬性」支持數據綁定?

請注意,我真正的課,我知道每一個屬性的類型,所以如果它可以更容易,改變上面的代碼,只需使用字符串值:

public class CustomDataBinding : Component 
{ 
    private Dictionary<String, String> _Properties = new Dictionary<String, String>(); 

    public CustomDataBinding() 
    { 
     _Properties["Property1"] = "Property1"; 
     _Properties["Property2"] = "Property2"; 
    } 
} 

我還需要驗證的支持,因爲我們的類也可以報告每個屬性的驗證狀態,但是我已經實現了IDataErrorInfo和IDataValidationInfo,我認爲這會給我提供。我也實現了INotifyPropertyChanged,所以我得到了我認爲的改變機制,但我需要發現並與屬性進行交談。除了這些接口之外,我應該考慮的任何其他內容都將是受歡迎的信息。

回答

5

這聽起來像你正在描述一個財產袋;這確實支持數據綁定,但您需要實施ICustomTypeDescriptorTypeDescriptionProvider。然後通過TypeDescriptor.GetProperties(obj)TypeDescriptor.GetProperties(type)定義可用的屬性 - 或者在列表的情況下通過ITypedList定義。如果屬性更改每個實例,則ICustomTypeDescriptor是合適的; TypeDescriptionProvider可以做每種類型的定製,並與BindingList<T>等工作,沒有任何額外的工作。

棘手的是,你需要定義類型的每個屬性 - 不簡單,如果你剛剛得到objectHere is a very simplified example,將所有屬性視爲字符串。在這個例子中,因爲我們綁定了一個列表,所以它使用ITypedList但不實現ICustomTypeDescriptor

注意,對於PropertyGrid,一個簡單的快捷鍵是使用TypeConverter - 這讓你來調整屬性,而不必使用ICustomTypeDescriptorTypeDescriptionProvider - see example

+0

我已經完成了列表,不知道同樣的方法在這裏是有效的,我在等待你們回答這裏時正在試驗ICustomTypeDescriptor,但我還有另外一個問題,我會在這裏接受這個問題的答案並提出另一個問題。 – 2009-09-09 07:03:04

+0

期待它;-p – 2009-09-09 07:04:06

+0

它是:http://stackoverflow.com/questions/1398109/multiple-bindingsource-components-necessary-for-just-one-data-source,基本上它圍繞我的有缺陷/不完整的ICustomTypeDescriptor實現。 – 2009-09-09 07:36:53

1

你總是可以暴露詞典作爲它的直接屬性,並訪問元素(雖然它會需要一個人指數和實施IListSourceIEnumerable

- 編輯

我必須說,雖然,你有效地使自己的無類型語言。有興趣的原因,也許有更好的辦法...

1

由於你不能發佈新的屬性,如何發佈您的字典作爲ObservableDictionary <字符串,對象> 。見this DrWPF article

然後,您可以使用key綁定到字典以獲取您所在的命名屬性。

+0

絕對值得研究,但現在馬克的答案看起來最有前途。 – 2009-09-09 07:24:41

相關問題