日期:2014-05-17  浏览次数:20708 次

新手请教TextBox的Text属性绑定问题
我是个C#新手,最近有个程序要把TextBox的Text属性与一个int属性绑定,发现一个奇怪的事,在一个属性中更改另一个属性,TextBox控件显示的值就可以自动更新,但用点击按钮的方法就无效。请看代码:

用于演示的类Class1:
C# code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication3
{
    class Class1
    {
        private int _a = 1;

        public int A
        {
            get { return _a; }
            set 
            {

                if (_a != value)
                {
                    _b = value + 1;
                    _a = value; 
                }
            }
        }

        private int _b = 2;

        public int B
        {
            get { return _b; }
            set { _b = value; }
        }
    }
}


当A的值改变时,B变为A+1。

界面:
C# code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        private Class1 _class1 = new Class1();
        private TextBox tbA;
        private TextBox tbB;
        private Button button1;

        public Form1()
        {
            tbA = new TextBox();  //与A绑定
            tbB = new TextBox();  //与B绑定
            button1 = new Button();
            
            tbA.Location = new Point(105, 39);
            tbA.Name = "tbA";
            tbA.Size = new Size(121, 21);
            
            tbB.Location = new Point(106, 118);
            tbB.Name = "tbB";
            tbB.Size = new Size(119, 21);
            
            button1.Location = new Point(148, 67);
            button1.Name = "button1";
            button1.Size = new Size(23, 45);
            button1.TabIndex = 2;
            button1.Text = "B加1";
            button1.Click += new System.EventHandler(button1_Click);

            this.Controls.Add(this.button1);
            this.Controls.Add(this.tbB);
            this.Controls.Add(this.tbA);

            tbA.DataBindings.Add("Text", _class1, "A");
            tbB.DataBindings.Add("Text", _class1, "B");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            _class1.B += 1;
        }
    }
}


在tbA中改变数值后按tab,tbB中的数值会自动更新。但点button1后B的值实际上是改变的,但控件中不会更新,除非用INotifyPropertyChanged。请问原因在哪里?

------解决方案--------------------
DataBindings方法绑定是有联动效果的,你要手动赋值就不会
tbA.Text=_class1.A;

------解决方案--------------------
你只是更改了B属性的值,而没有通知客户端B属性值已经更改
C# code
 class Class1 : INotifyPropertyChanged
    {
        private int _a = 1;

        public int A
        {
            get { return _a; }
            set
            {

                if (_a != value)
                {
                    _b = value + 1;
                    _a = value;
                }
            }
        }

        private int _b = 2;

        public int B
        {
            get { return _b; }
            set
            {
                _b = value;
                NotifyPropertyChanged("B");
            }
        }


        #region INotifyPropertyChanged 成员

        public event PropertyChangedEventHandler PropertyChanged;
        public void NotifyPropertyChanged(string ProName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(ProName));
            }
        }
        #endregion
    }

------解决方案--------------------
没有 INotifyProperty