2013-02-08 64 views
1

我試圖將一些控件綁定到一個對象 - 這通常是一個非常簡單的過程。不幸的是,如果我結合自CollectionBase到繼承,綁定到類的字段的對象將導致錯誤:綁定到派生自CollectionBase的類的屬性

Cannot bind to the property or column Caption on the DataSource. Parameter name: dataMember

刪除CollectionBase的inheiritance使這個問題消失,但我需要這個對象是一個集合。看起來好像CollectionBase會導致更高級別的屬性變成「不可綁定的」。有一些我可以重寫的屬性來解決這個問題嗎?任何其他想法?

我在網上發現這個例子很容易總結這個問題。不幸的是,我還沒有找到我見過這個例子發佈的所有地方的答案。

代碼:

[STAThread] 
static void Main() 
{ 
    TestCollection obj = new TestCollection(); 
    using (Form f = new Form()) 
    using (BindingSource bs = new BindingSource()) 
    { 
     bs.DataSource = typeof(Test); 
     f.DataBindings.Add("Text", bs, "Caption"); 
     bs.DataSource = obj; // breaks 

     //List<TestallData = new List<Test>(); 
     //allData.Add(obj); 
     //bs.DataSource = allData; 
     f.ShowDialog(); 
    } 
} 

class TestCollection : CollectionBase 
{ 
    public string Caption { get { return "Working"; } } 
} 
+0

爲什麼要設置兩次DataSource?先打字,然後打個例子。 – abatishchev 2013-02-08 18:28:59

回答

0

CollectionBase用作數據源使用的綁定嘗試何時查找列表用於各個結合數據內提供接口,用於對象列表,因爲這樣的。當沒有列表時,您遇到問題。

如果你想要一個標題,你想使用CollectionBase你應該有2個類參與,而不僅僅是一個。

public class TestObj 
{ 
    public string caption { get { return "yay"; } } 
} 

public class TestCol : CollectionBase 
{ 
    //methods that implement CollectionBase for the TestObj type 
} 

與這兩個你可以綁定兩種方式之一。

TestObj obj = new TestObj(); 
TestCol col = new TestCol(); 
col.Add(obj); 

//bind to obj, OR bind to col. Both would work with this setup. 

http://msdn.microsoft.com/en-us/library/system.collections.collectionbase%28v=vs.90%29.aspx

還有就是CollectionBase有一個樣本實現。

UPDATE:下編輯COMMENT

沒有,我個人知道,讓你綁定到一個集合的外性質的任何方法。作爲一種解決方法,您可以使用3類系統(是的,我知道,越來越複雜)。

public class TestHeader 
{ 
    public string Data {get;set;} 
} 

public class TestCol : CollectionBase 
{ 
    //... 
} 

public class TestObj 
{ 
    public TestHeader header {get;set;} 
    public TestCol col {get;set;} 
} 

綁定外字段TestObj.header並綁定集合字段TestObj.col。這是一種解決方法,但正如我所說的,我實際上並不知道一種直接實現你想要的方式。我希望我做到了,我自己的部分代碼可以從中受益。

另一個例子

你也可以用兩個班做,但你仍然需要嵌套集合本身

public class TestObj 
{ 
    public string data {get;set;} 
    public TestCol col {get;set;} 
} 

在這種情況下,單個數據字段綁定到TestObj,和收集字段爲TestObj.col

+0

嗨Nevyn,感謝您的迴應,但我不確定我的問題是否清楚。在示例中「標題」是集合本身的屬性 - 不是集合中的項目。想象一下像「Count」這樣的屬性 - 這正是我所需要的。另一個例子:一個類可能是一個學生對象的集合,但該類也會有一個Name和Time屬性。 – 2013-02-08 18:17:50