【发布时间】:2021-03-10 08:17:21
【问题描述】:
我有两个按钮并将它们的属性绑定到数据对象的两个属性。
但是当我调用数据对象的PropertyChanged 时,每个属性都会更新。
public partial class Form1 : Form
{
private DataClass data = new DataClass();
public Form1()
{
InitializeComponent();
ButtonA.DataBindings.Add("Text", data, "DataA");
ButtonB.DataBindings.Add("Text", data, "DataB");
ButtonB.Click += new EventHandler(OnButtonBClicked);
}
private void OnButtonBClicked(object sender, EventArgs e)
{
data.DataA += "1";
data.DataB += "1";
data.Notify("DataB");
}
}
public class DataClass : INotifyPropertyChanged
{
public string DataA { get; set; }
public string DataB { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
public DataClass() {}
public void Notify(string property_name)
{
PropertyChanged(this, new PropertyChangedEventArgs(property_name));
}
}
-
当我按
ButtonB(这意味着我呼叫PropertyChanged(this, new PropertyChangedEventArgs("DataB")))时,ButtonA和ButtonB都会显示新文本。 -
如果我调用
PropertyChanged(this, new PropertyChangedEventArgs("DataA")),两个按钮都会更新。 -
如果我不更改
DataA/DataB的值而只是调用PropertyChanged(this, new PropertyChangedEventArgs("DataB")),仍然会更新两个按钮(可以通过断点调试注意到)。 -
如果我调用
PropertyChanged(this, new PropertyChangedEventArgs("QQQ")),则不会更新任何按钮。
PropertyChangedEventArgs 有一个名为propertyName 的属性,我以为它是用来指定一个要通知的属性,但它没有。
在我的真实代码中,DataB 的变化比DataA 更频繁。我不想每次更改DataB 都更新ButtonA,这太耗时了。
问题:为什么会发生这种情况?当数据源属性发生变化时,我如何才能只更新真正连接到它的属性?
(所有代码在 Windows 上都是 .Net Framework 4.7.1。)
【问题讨论】:
-
你愿意修改你的类结构来实现复杂的数据绑定吗?在这种情况下,您的
string属性将更改为类对象。简单绑定会导致对所有绑定属性调用 getter,否则所有设置为新值的属性都会在 Binding 对象中引发更改事件。 -
@Jimi :哦,是的。这是一个好方法。我将每个属性都放在一个对象中,然后一切都按预期工作。thx。
标签: c# winforms data-binding propertychanged