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

ответ

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

Hi Nevyn, Спасибо, что ответил, но я не уверен, что мой вопрос был ясен. В примере «Caption» является свойством самой коллекции, а не элементом в коллекции. Представьте себе свойство «граф» - это то, что я ищу. Другой пример: класс может быть набором объектов-учеников, но класс также будет иметь свойство Name и Time. –

 Смежные вопросы

  • Нет связанных вопросов^_^