【问题标题】:Binding to property of a class derived from CollectionBase绑定到从 CollectionBase 派生的类的属性
【发布时间】:2013-02-08 16:16:17
【问题描述】:

我正在尝试将一些控件绑定到一个对象 - 这通常是一个非常简单的过程。不幸的是,如果我绑定的对象继承自 CollectionBase,绑定到该类字段会导致错误:

无法绑定到 DataSource 上的属性或列 Caption。参数名称:dataMember

删除 collectionbase 继承使这个问题消失,但我需要这个对象是一个集合。似乎 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"; } }
}

【问题讨论】:

  • 为什么要设置两次DataSource?先输入,再实例化。

标签: c# winforms data-binding exception-handling collectionbase


【解决方案1】:

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 的示例实现。

更新:根据评论编辑

据我个人所知,没有任何方法可以让您绑定到集合的外部属性。作为一种解决方法,您可以使用 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

【讨论】:

  • 您好 Nevyn,感谢您的回复,但我不确定我的问题是否明确。在示例中,“Caption”是集合本身的属性,而不是集合中的项目。想象一下像“Count”这样的属性——这就是我要找的。另一个例子:一个类可以是学生对象的集合,但该类也有一个 Name 和 Time 属性。
猜你喜欢
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
相关资源
最近更新 更多