#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. Вау. Это было до боли просто, учитывая, как долго я пытался это сделать. Именно поэтому я и спросил. Большое спасибо!