Привязка данных 101. Как это сделать в .Net - PullRequest
4 голосов
/ 08 сентября 2011

Это кажется очевидной вещью, которую нужно достичь, но я просто не могу понять это. Допустим, у меня есть список строк. Как связать его со списком, чтобы он обновлялся по мере изменения данных списка? Я использую vb.net.

Я пробовал это до сих пор. Мне удалось отобразить данные, но не изменить их:

Public Class Form1

    Private mycountries As New List(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")
        mycountries.Sort()
        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)
        ListBox1.DataSource = mycountries 'this does not update
    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

Я тоже пробовал это:

ListBox1.DataBindings.Add("items", mycountries, "Item")

Но элементы доступны только для чтения, поэтому они не работают.

Кроме того, если я хочу связать свойство enabled кнопки с логическим значением, как я могу это сделать? Я пробовал это, но я не знаю, что добавить для последнего параметра.

Dim b As Boolean = True
Button3.DataBindings.Add("Enabled", b, "")

Ответы [ 2 ]

7 голосов
/ 08 сентября 2011

Вам необходимо использовать коллекцию, которая поддерживает уведомления об изменениях для вашего источника данных. Когда вы удаляете элемент из простого списка, он никому об этом не сообщает.

Вот пример использования 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.

0 голосов
/ 08 сентября 2011

Вы можете сделать этот трюк:

ListBox1.DataSource = Nothing
mycountries.RemoveAt(0)
ListBox1.DataSource = mycountries
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...