使用双向DataBinding的Winforms Textbox不能正常工作

时间:2011-07-18 17:16:49

标签: c# binding textbox

Winforms有两个文本框。 textBox2绑定到属性单位。 我希望对单位或textBox2所做的任何更改都会分别自动更新textBox2或单位。但事实并非如此。 以下是Winform代码的三个版本。

第一版设置数据绑定,希望它有两种方式自动更新但不起作用

public partial class Receiver : Form, INotifyPropertyChanged
{         

    private int unit=0;
    public int Unit
    {
        get { return unit; }
        set
        {
            if (value != unit)
            {
                unit = value;                                          
            }
        }
    }

    public Receiver()
    {
        InitializeComponent();            
        textBox2.DataBindings.Add("Text", Unit, "Unit");
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {   
        //textBox1 change makes Unit change, 
        //I wish the change will be displayed in textBox2 automatically
        Unit = Convert.ToInt32(textBox1.Text);
    }        
}
带有事件处理程序的

第二版,使用事件处理程序更新textBox2的硬代码

但更改textBox2仍然不会自动更新单元

public partial class Receiver : Form, INotifyPropertyChanged
{ 
    public event PropertyChangedEventHandler PropertyChanged;

    private int unit=0;
    public int Unit
    {
        get { return unit; }
        set
        {
            if (value != unit)
            {
                unit = value;                       
                if (PropertyChanged != null)
                {
                   PropertyChanged(this, new PropertyChangedEventArgs(info));
                }  
            }
        }
    }

    public Receiver()
    {
        InitializeComponent();            
        textBox2.DataBindings.Add("Text", this.Unit, "Unit", false, 
                                                 DataSourceUpdateMode.OnPropertyChanged);
        PropertyChanged += new PropertyChangedEventHandler(OnPropertyChanged);

    }    

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        Unit = Convert.ToInt32(textBox1.Text);
    }


    private void OnPropertyChanged(object sender, EventArgs e)
    {  
        //this actually is hard coded to update textBox2, binding does no help
        textBox2.Text = Unit.ToString();
    }
}

第三版为什么要使用事件处理程序,我们可以这样做。

public partial class Receiver : Form, INotifyPropertyChanged
{ 
    private int unit=0;
    public int Unit
    {
        get { return unit; }
        set
        {
            if (value != unit)
            {
                unit = value;   
                textBox2.text = unit.toString();                          
            }
        }
    }

    public Receiver()
    {
        InitializeComponent();            
        textBox2.DataBindings.Add("Text", Unit, "Unit");
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        Unit = Convert.ToInt32(textBox1.Text);           
    }   

    private void textBox2_TextChanged(object sender, EventArgs e)
    {
        Unit = Convert.ToInt32(textBox2.Text);           
    } 
}

}

第二版第三版出现问题,对textbox1所做的任何更改都会导致textbox2更新。那将导致很多CPU周期。最好的方法是当鼠标焦点离开textBox1然后进行更新。那怎么办呢?

1 个答案:

答案 0 :(得分:5)

您的代码中存在问题:

textBox2.DataBindings.Add("Text", Unit, "Unit");

您应该使用包含该属性而不是属性本身的实例替换数据源,此处还应指定数据源更新模式将其设置为DataSourceUpdateMode.OnPropertyChanged。所以:

textBox2.DataBindings.Add("Text", this, "Unit", false, DataSourceUpdateMode.OnPropertyChanged);

//test using the second or the third approach:
Unit = 15;//now the textBox2.Text equals to 15 too.

textBox2.Text = 12;//now Unit equals 12 too