1

私はいくつかのコントロールをオブジェクトにバインドしようとしています-これは通常、かなり簡単なプロセスです。残念ながら、バインドしているオブジェクトがCollectionBaseから継承している場合、そのクラスフィールドにバインドするとエラーが発生します。

データソースのプロパティまたは列のキャプションにバインドできません。パラメータ名:dataMember

コレクションベースの継承を削除すると、この問題は解消されますが、このオブジェクトをコレクションにする必要があります。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"; } }
}
4

1 に答える 1

0

CollectionBaseオブジェクトのリストのインターフェイスを提供します。データソースとして使用される場合、バインディングはリスト内で個々のバインディングデータを検索しようとします。リストがない場合は問題があります。

キャプションが必要で、使用したい場合CollectionBaseは、1つだけでなく、2つのクラスを使用する必要があります。

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

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

これらの2つを使用すると、2つの方法のいずれかをバインドできます。

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あります。

更新:コメントから編集

コレクションの外部プロパティにバインドできる方法は、私が個人的に知っているものはありません。回避策として、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。これは回避策ですが、述べたように、私は実際にあなたが望んでいるように見えるものを直接実装する方法を知りません。私がやったらいいのにと思います。自分のコードには、それから恩恵を受ける部分があります。

もう一つの例

2つのクラスでそれを行うこともできますが、それでもコレクション自体をネストする必要があります

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

この場合、単一のデータフィールドをにバインドしTestObj、コレクションフィールドをにバインドしますTestObj.col

于 2013-02-08T18:12:33.643 に答える