Reputation: 8116
I have a ListBox (MyListBox
) on my screen, and a Textbox (MyTextBox
).
The ListBox is filled with a List(Of T), which are all custom items.
Now I try to do this:
The ListBox' datasource is the List(Of T).
Now when an Item changes I want the textbox to be updated to a particular property of the selected item in my ListBox.
In code this means:
Me.MyListBox.DisplayMember = "SelectionName"
Me.MyListBox.ValueMember = "Id"
MyTextbox.DataBindings.Add(New Binding("Text", Me._listOfItems, "SelectedItem.Comment", True, DataSourceUpdateMode.OnPropertyChanged))
Me.MyListBox.DataSource = Me._listOfItems
this does not work. But when I bind to SelectedValue instead of SelectedItem it works perfectly.
The _listOfItems
is declared as this:
Dim _listOfItems As List(Of MyItem) = New List(Of MyItem)()
Where MyItem
is this:
public class MyItem
{
public string SelectionName { get; set; }
public int Id { get; set; }
public string Comment { get; set; }
}
I tried overriding the ToString()
in MyItem
so that it would use that. But that doesn't work either.
Anybody care to give it a try?
Upvotes: 7
Views: 16256
Reputation: 24132
One of the easiest way, I guess, would be to use a BindingSource
, setting it as the ListBox.DataSource
property to your BindingSource
on design.
BindingSource
on your form;ListBox.DataSource
property to your BindingSource
;ValueMember
and DisplayMember
properties just like you're actually doing;DataBinding
for your TextBox
control, and use your BindingSource
as the source, using your MyItem.Comment
property;List(Of MyItem)
to your Binding.DataSource
property;CurrencyManager.CurrentItem
's Comment property, that is, the currently ListBox.SelectedItem
.Indeed, you would perhaps need to implement the INotifyPropertyChanged
interface to make it work properly.
But if this all work perfect with the SelectValue, why don't you just use it?
Upvotes: 12
Reputation: 1038
The code below shows how I am doing it. I first set my ListBox DataSource to a class with a collection of BindingList. The class implements IBindingList. I have two TextBoxes I want to bind the SelectedItem to. The code below is how I am doing it:
lbControl.DataSource = SharepointTestBusinessLayer.Control.ListAll();
lbControl.DisplayMember = "ControlName";
lbControl.SelectedIndex = 0;
scTextBoxControlID.DataBindings.Add("Text", this.lbControl.DataSource, "ControlID");
scTextBoxControlName.DataBindings.Add("Text", this.lbControl.DataSource, "ControlName");
Upvotes: 0