C#绑定:如何禁用BindingList中的CurrencyManager,使当前项的位置不被维护,也不被通知

本文关键字:通知 位置 维护 绑定 何禁用 BindingList CurrencyManager 中的 | 更新日期: 2023-09-27 17:48:49

我有两个ListBox,它们被数据绑定到同一个BindingList。

问题是,当从GUI更改所选项目时,它会更改BindingList中的位置,然后BindingList会向另一个ListBox发出信号以更改其所选项目。

所以我已经同步了两个ListBoxes Selected Item,这对我来说不好

我想保持项目列表的同步。而没有光标位置。

如何禁用该光标,使其不被维护?

示例代码(只需在设计时将两个ListBox添加到Form中,并注册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");
    }
}

谢谢,--冉。

C#绑定:如何禁用BindingList中的CurrencyManager,使当前项的位置不被维护,也不被通知

将此行添加到Form_Load:

this.listBox1.BindingContext = new BindingContext();
将listBox1和listBox2声明为以下类型似乎会产生所需的行为。
class MyListBox: ListBox {
    protected override void OnSelectedIndexChanged (EventArgs a) {
        if (DataManager != null) {
            DataManager.SuspendBinding();
        }
    }
}

谨致问候,tamberg

我对这个问题的解决方案是使用普通的List而不是BindingList,并且只调用Form对象(在更改之前):这BindingContext[Your List].ShupendBinding();以及列表更改后这BindingContext[Your List].RemoreBinding();这将更新所有有界控件。

请注意,MSDN链接中也提到了这一点:

"如果绑定到未实现IBindingList接口的数据源,如ArrayList,则在更新数据源时,绑定控件的数据将不会更新。例如,如果将组合框绑定到ArrayList并将数据添加到ArrayList,则这些新项将不会出现在组合框中。但是,可以通过调用控件绑定到的BindingContext类实例上的uspendBinding和ResumeBinding方法。"