绑定到从CollectionBase派生的类的属性
本文关键字:属性 派生 CollectionBase 绑定 | 更新日期: 2023-09-27 17:58:35
我正在尝试将一些控件绑定到一个对象,这通常是一个非常简单的过程。不幸的是,如果我绑定到的对象继承自CollectionBase,那么绑定到该类字段会导致错误:
无法绑定到DataSource的属性或列Caption。参数名称: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"; } }
}
CollectionBase
为对象列表提供接口,例如,当用作数据源时,绑定会尝试在列表中查找单个绑定数据。如果没有列表,则表示您有问题。
如果你想要一个标题,并且你想使用CollectionBase
,你应该有两个类,而不仅仅是一个。
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
的示例实现。
更新:根据评论编辑
据我个人所知,没有任何方法允许您绑定到集合的外部属性。作为一种变通方法,您可以使用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;}
}
将外部字段绑定到CCD_ 4并且将集合字段绑定到CCD_。这是一个变通方法,但正如所说,我实际上不知道如何直接实现您想要的东西。我希望我做到了,我自己的代码中有一些部分会从中受益。
另一个例子
你也可以用两个类来完成,但你仍然需要嵌套集合本身
public class TestObj
{
public string data {get;set;}
public TestCol col {get;set;}
}
在这种情况下,将单个数据字段绑定到TestObj
,并将集合字段绑定到TestObj.col