BindingSource ListChanged事件在位置改变时触发

本文关键字:改变 位置 ListChanged 事件 BindingSource | 更新日期: 2023-09-27 18:03:15

来自微软:"BindingSource。当底层列表更改或列表中的项更改时发生"ListChanged"事件。

但是在我的例子中,事件在每次位置变化时触发。这个表单有一个UserControl,一个BindingSource和一个Button。

用户控件有一个文本框和两个属性:

    /// <summary>
    /// Is working: ListChanged is not fired
    /// </summary>
    public override string Text
    {
        get { return textBox1.Text; }
        set { textBox1.Text = value; }
    }
    /// <summary>
    /// Is not working: ListChanged is fired on Position changes
    /// </summary>
    public string MyProperty
    {
        get { return textBox1.Text; }
        set { textBox1.Text = value; }
    }

窗体上的按钮改变了BindingSource的位置:

void next_Click(object sender, EventArgs e)
{
    bindingsource.Position += 1;
}

当我使用"Text"属性绑定控件时,ListChanged事件不发生,如预期的那样:

myusercontrol1.DataBindings.Add("Text", bindingsource, "name");

但是当我使用"MyProperty"属性绑定控件时,ListChanged事件会在位置更改时触发:

myusercontrol1.DataBindings.Add("MyProperty", bindingsource, "name");

我尝试了不同的数据源,就像下面的例子:

public Example()
{
    InitializeComponent();
    string xml = @"<states>"
        + @"<state><name>Washington</name></state>"
        + @"<state><name>Oregon</name></state>"
        + @"<state><name>Florida</name></state>"
        + @"</states>";
    byte[] xmlBytes = Encoding.UTF8.GetBytes(xml);
    MemoryStream stream = new MemoryStream(xmlBytes, false);
    DataSet set = new DataSet();
    set.ReadXml(stream);
    bindingsource.DataSource = set;
    bindingsource.DataMember = "state";
    bindingsource.ListChanged += BindingNavigator_ListChanged;
    myusercontrol1.DataBindings.Add("MyProperty", bindingsource, "name");
}

我如何使用MyProperty并避免在位置更改时触发ListChanged事件?为什么文本属性按预期工作,但MyProperty不是?

提前感谢,克里斯蒂安·

BindingSource ListChanged事件在位置改变时触发

为什么Text属性按预期工作,但MyProperty不是?

都是关于变更通知的。您可能知道,Windows Forms数据绑定支持两种类型的源对象更改通知——实现INotifyPropertyChanged的对象或提供{PropertyName}Changed命名事件的对象。

现在看看你的用户控件。首先,它没有实现INotifyPropertyChanged。但是,有一个名为TextChanged事件,因此当您数据绑定到Text属性时,BindingSource将使用该事件触发ListChanged。但是当您绑定到MyProperty时,由于没有称为MyPropertyChanged的事件,因此当Position(因此是当前对象)发生变化时,数据绑定基础结构将尝试用ListChanged事件来模拟它。

话虽如此,在用户控件中添加以下内容:

public event EventHandler MyPropertyChanged
{
    add { textBox1.TextChanged += value; }
    remove { textBox1.TextChanged -= value; }
}

和数据绑定到属性将按预期工作