Синхронизировать список со списком? - PullRequest
3 голосов
/ 21 марта 2011

У меня на WinForms есть список, в котором пользователи могут перемещать элементы вверх и вниз, и этот список также совпадает со списком, который у меня есть, и мне было интересно, как будет наиболее эффективный способ поддерживать обе синхронизации.

например, чтобы переместить предмет вниз, у меня есть:

int i = this.recoveryList.SelectedIndex;
object o = this.recoveryList.SelectedItem;

if (i < recoveryList.Items.Count - 1)
{
  this.recoveryList.Items.RemoveAt(i);
  this.recoveryList.Items.Insert(i + 1, o);
  this.recoveryList.SelectedIndex = i + 1;
}

А у меня есть:

public List<RouteList> Recovery = new List<RouteList>();

Который я бы хотел обновлять в списке.

Должен ли я просто очистить Восстановление и обновить данные текущего списка или есть лучший способ обновления как при движении вверх, так и вниз?

Я в основном спрашиваю, потому что типы из списка в список отличаются.

Ответы [ 2 ]

2 голосов
/ 21 марта 2011

.Net обеспечивает встроенную поддержку для этого типа поведения. Чтобы использовать его, вам нужно изменить тип списка восстановления на:

public BindingList<RouteList> Recovery = new BindingList<RouteList>();

И затем вы используете этот BindingList в качестве источника данных в ваших элементах управления:

listBox1.DataSource = Recovery;

Вот простой пример использования BindingList of String. У меня есть два списка в форме, и они оба синхронизируются, поскольку выбранный элемент заменяется первым элементом в списке:

public partial class Form1 : Form
{
    private readonly BindingList<string> list = new BindingList<string> { "apple", "pear", "grape", "taco", "screwdriver" };

    public Form1()
    {
        InitializeComponent();
        listBox1.DataSource = list;
        listBox2.DataSource = list;
    }

    private void listBox1_KeyUp(object sender, KeyEventArgs e)
    {
        var tmp = list[0];
        list[0] = list[listBox1.SelectedIndex];
        list[listBox1.SelectedIndex] = tmp;
    }
}
2 голосов
/ 21 марта 2011

Правильный способ состоит в том, чтобы изменить базовый объект, а затем заставить UI Control реагировать на это изменение.

Чтобы ListBox реагировал на изменения в вашей коллекции объектов (вашем List), вам нужно вместо этого использовать ObservableCollection. Это как INotifyPropertyChanged для коллекций.

Затем вы делаете свои действия вверх / вниз, изменяя коллекцию, а НЕ пользовательский интерфейс.

EDIT

Я не говорю, чтобы добавить наблюдателя в ТОП коллекции. Я говорю, чтобы изменить тип вашей коллекции. Не используйте List, используйте ObservableCollection. Он работает (в основном) так же, но уведомляет связанные элементы управления пользовательского интерфейса об изменениях своих элементов.

Как пример, пожалуйста, Google для этого. Это то, что я должен сделать, чтобы обеспечить один в любом случае ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...