我是数据绑定的新手,今天遇到了以下我无法理解的奇怪现象:
我有一个带有两个标签(labelA 和 labelB)和两个按钮(buttonA 和 buttonB)的表单。
表单承载一个具有两个属性(CountA 和 CountB)的对象(称为“formState”)。labelA.Text 数据绑定到 formState.CountA,labelB.Text 数据绑定到 formState.CountB。
当 buttonA 被按下时,它使 formState 以“CountA”作为属性名称引发 PropertyChange 事件。当 buttonB 被按下时,它会引发 formState.PropertyChange,并将“CountB”作为属性名称。
我希望按下 buttonA 时只有 labelA 得到更新,按下 buttonB 时只有 labelB 得到更新。但是,当我按下任何按钮时,两个标签都会更新。我可以看到这一点,因为每次读取它们的值时 CountA 和 CountB 属性都会递增并返回一个计数器。代码如下。
有人对这种行为有解释吗?
public partial class Form1 : Form
{
private FormState formState = new FormState();
public Form1()
{
InitializeComponent();
labelA.DataBindings.Add(
new Binding("Text", formState, "CountA"));
labelB.DataBindings.Add(
new Binding("Text", formState, "CountB"));
}
private void buttonA_Click(object sender, EventArgs e)
{
formState.raisePropertyChangedEvent("CountA");
// both labelA and labelB get updated - why not just labelA?
}
private void buttonB_Click(object sender, EventArgs e)
{
formState.raisePropertyChangedEvent("CountB");
// both labelA and labelB get updated - why not just labelB?
}
public class FormState : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private int countA = 0;
private int countB = 0;
public int CountA
{
get { return ++countA; }
}
public int CountB
{
get { return ++countB; }
}
public void raisePropertyChangedEvent(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}