gpt4 book ai didi

c# - BindingSource ListChanged 事件在位置更改时触发

转载 作者:行者123 更新时间:2023-11-30 23:21:52 29 4
gpt4 key购买 nike

来自微软:“BindingSource.ListChanged 事件在基础列表更改或列表中的项目更改时发生”。

但在我的示例中,事件会在每次位置更改时触发。表单有一个 UserControl、一个 BindingSource 和一个 Button。

用户控件有一个 TextBox 和两个属性:

    /// <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”属性绑定(bind)控件时,ListChanged 事件没有发生,正如预期的那样:

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

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

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

我尝试了不同的 DataSorces,就像这个例子:

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 事件?为什么 Text 属性按预期工作,但 MyProperty 却没有?

提前致谢,克里斯蒂安

最佳答案

Why Text property is working as expected but MyProperty is not?

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

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

话虽如此,将以下内容添加到您的用户控件中:

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

并且数据绑定(bind)到您的属性将按预期工作。

关于c# - BindingSource ListChanged 事件在位置更改时触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39066217/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com