1

我是数据绑定的新手,今天遇到了以下我无法理解的奇怪现象:

我有一个带有两个标签(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));
            }
        }
    }
4

2 回答 2

3

它可能是可观察对象的天真消费者。INotifyPropertyChangedObjects 的天真消费者可能会忽略属性名称,而只是重新评估整个事情。可以想象这个类看起来像:

class NaiveConsumer
{
   void Foo(INotifyPropertyChanged observable)
   {
       observable.PropertyChanged += PropertyChangedHandler;
   }

   void PropertyChangedHandler(object sender, PropertyChangedEventArgs e)
   {
      // Evaluate all properties, even though only 1 prop changed.
      this.NameTextBox.Text = observable.Name;
      this.AgeTextBox.Text = observable.Age;
   }
}
于 2009-11-13T02:19:11.430 回答
1

您的班级的责任是提供更改通知 - 消费者有责任决定如何处理它。如果它选择检查任何已更改属性的每个属性,它就可以这样做。

于 2009-11-13T02:25:39.177 回答