Вам необходимо использовать коллекцию, которая поддерживает уведомления об изменениях для вашего источника данных. Когда вы удаляете элемент из простого списка, он никому об этом не сообщает.
Вот пример использования BindingList
вместо:
Public Class Form1
Private mycountries As New BindingList(Of String)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
mycountries.Add("Norway")
mycountries.Add("Sweden")
mycountries.Add("France")
mycountries.Add("Italy")
' BindingList doesn't have a Sort() method, but you can sort your data ahead of time
ListBox1.DataSource = mycountries 'this works fine
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
mycountries.RemoveAt(0)
' no need to set the DataSource again here
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
MsgBox(mycountries(0))
End Sub
End Class
По второму вопросу вы не привязываетесь к переменной при добавлении привязки данных. Вы связываетесь с объектом (который действует как источник данных), а затем указываете свойство для этого объекта, которое даст вам значение, с которым вы хотите связать.
Итак, для кнопки вы хотите что-то вроде этого (извиняюсь за C #, но вы поймете):
public class SomeModel
{
public bool ButtonEnabled { get; set; }
}
public class Form1 : Form
{
public Form1()
{
InitializeComponent();
SomeModel model = new SomeModel();
// first parameter - button's property that should be bound
// second parameter - object acting as the data source
// third parameter - property on the data source object to provide value
button1.DataBindings.Add("Enabled", model, "ButtonEnabled");
}
Как правило, привязка данных связана с уведомлением об изменениях. Если вам нужно привязать пользовательские объекты, загляните в интерфейс INotifyPropertyChanged
.