Windows Forms — привязка данных к свойству свойств источника данных

#c# #winforms #data-binding

#c# #winforms #привязка данных

Вопрос:

У меня есть источник привязки данных, и у него есть связанное свойство. Когда это свойство источника основано на тексте / целых числах и т. Д., Все работает нормально. Я могу связать это с текстовым полем или меткой в порядке.

Некоторые из моих свойств представляют собой списки. Это тоже хорошо, я могу создать новый listBindingSource, указать его источник данных на исходный источник привязки и элемент данных в качестве списка и указать на это, скажем, listview. Я установил DisplayMember для свойства элемента в списке, и он работает нормально.

Однако, если свойство не является ни списком, ни текстом / int, а просто одним объектом… Я застрял. Невозможно сказать, что я хочу привязать свойство properties к объекту. Там нет ‘DisplayMember’, чтобы помочь.

Пример:

У меня есть объект MeteredSpace. Он обладает свойствами

 public string Name {get;set;}
public List<MeteredSpace> ChildMeteredSpaces {get;set;}
public MeteredSpace ParentMeteredSpace {get;set;}
 

Затем я определяю следующее

 //underlying datasource
this.meteredSpaceBindingSource.DataSource = typeof(SEMS.LinqObjects.MeteredSpace);
//data source of children
this.childMeteredSpacesBindingSource.DataMember = "ChildMeteredSpaces";
this.childMeteredSpacesBindingSource.DataSource = this.meteredSpaceBindingSource;
 

Теперь для моих элементов управления:

 //nice and easy, picking directly from the underlying data source
this.nameTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text",this.meteredSpaceBindingSource, "Name", true));

//our child metered space list box is pretty easy too:
this.meteredSpaceListBox.DataSource = this.childMeteredSpacesBindingSource;
this.meteredSpaceListBox.DisplayMember = "Name";

//then we come to our parent text box
this.nameTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text",this.meteredSpaceBindingSource, "ParentMeteredSpace", true));
 

У меня нет способа указать его на свойство имени ParentMeteredSpace, как я делаю со списком. Я также не могу создать для него хороший новый источник привязки.

Кто-нибудь знает способ обойти это? Я посмотрел на переопределение элемента управления и добавление собственного DisplayMember, но я начал думать, что может быть лучший способ сделать это.

Спасибо

Ответ №1:

Вы должны иметь возможность ссылаться через родительское свойство:

 Binding b = new Binding("Text",
                        this.meteredSpaceBindingSource,
                        "ParentMeteredSpace.Name",
                        true);
this.nameTextBox.DataBindings.Add(b);
 

Комментарии:

1. Извините, мой плохо заданный вопрос. Это свойства (это сгенерированный код из Linq в Sql). Я исправлю.

2. Вау. Это было до боли просто, учитывая, как долго я пытался это сделать. Именно поэтому я и спросил. Большое спасибо!