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不是?
提前感谢,克里斯蒂安·
为什么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; }
}
和数据绑定到属性将按预期工作