Привязка C #: как я могу отключить CurrencyManager в BindingList, чтобы позиция текущего элемента не поддерживалась и не сигнализировалась? - PullRequest
2 голосов
/ 06 ноября 2008

У меня есть два ListBox'а, привязанных к одному и тому же BindingList.

Проблема заключается в том, что при изменении выбранного элемента из графического интерфейса он меняет положение в BindingList, а затем BindingList сигнализирует другому ListBox об изменении его выбранного элемента.

Итак, у меня есть два синхронизированных элемента списка ListBoxes, что мне не подходит.

Я бы хотел синхронизировать список элементов. без позиции курсора.

Как отключить этот курсор, чтобы он не сохранялся?

пример кода (просто добавьте два ListBox в форму во время разработки, зарегистрируйте события SelectedIndexChanged и зарегистрируйте событие нажатия кнопки с помощью кнопки):

public partial class Form1 : Form
{
    BindingList<string> list = new BindingList<string>();

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        list.Add("bla1");
        list.Add("bla2");
        list.Add("bla3");

        this.listBox1.DataSource = list;
        this.listBox2.DataSource = list;
    }

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (listBox1.SelectedIndex != -1)
            System.Diagnostics.Trace.WriteLine("ListBox1: " + listBox1.SelectedItem.ToString());
    }

    private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (listBox2.SelectedIndex != -1)
            System.Diagnostics.Trace.WriteLine("ListBox2: " + listBox2.SelectedItem.ToString());
    }

    // Register this event to a button
    private void button1_Click(object sender, EventArgs e)
    {
        list.Add("Test");
    }
}

Спасибо, --Ran.

Ответы [ 3 ]

7 голосов
/ 10 ноября 2008

Добавьте эту строку к Form_Load:

this.listBox1.BindingContext = new BindingContext();
2 голосов
/ 07 ноября 2008

Объявление listBox1 и listBox2 следующего типа приводит к желаемому поведению.

class MyListBox: ListBox {

    protected override void OnSelectedIndexChanged (EventArgs a) {
        if (DataManager != null) {
            DataManager.SuspendBinding();
        }
    }

}

С уважением, Тамберг

0 голосов
/ 10 ноября 2008

Мое решение для этой проблемы состоит в том, чтобы использовать обычный List вместо BindingList и просто вызвать (до изменения) объект Form: this.BindingContext [Ваш список] .SuspendBinding (); и после изменения в список this.BindingContext [Ваш список] .ResumeBinding (); Это обновляет все ограниченные элементы управления.

Обратите внимание, что это также указано в ссылке MSDN здесь :

"Если вы привязаны к источнику данных, который не реализует интерфейс IBindingList, например ArrayList, данные привязанного элемента управления не будут обновляться при обновлении источника данных. Например, если у вас есть привязка со списком в ArrayList и данные добавляются в ArrayList, эти новые элементы не будут отображаться в поле со списком. Однако вы можете принудительно обновить поле со списком, вызвав методы SuspendBinding и ResumeBinding для экземпляра класса BindingContext, к которому контроль связан. "

...