DataBindings的问题,请解释一下

时间:2010-10-28 18:15:56

标签: c# .net winforms data-binding

public partial class Form1 : Form
{
    MyClass myClass = new MyClass("one", "two");

    public Form1()
    {
        InitializeComponent();
        textBox1.DataBindings.Add("Text", myClass, "Text1", false, DataSourceUpdateMode.Never);
        textBox2.DataBindings.Add("Text", myClass, "Text2", false, DataSourceUpdateMode.Never);
    }

    private void saveButton_Click(object sender, EventArgs e)
    {
        myClass.Text1 = textBox1.Text;
        myClass.Text2 = textBox2.Text;
        //textBox1.DataBindings["Text"].WriteValue();
        //textBox2.DataBindings["Text"].WriteValue();
    }
}

public class MyClass : INotifyPropertyChanged
{
    private string _Text1;
    private string _Text2;

    public event PropertyChangedEventHandler PropertyChanged;

    public string Text1
    {
        get { return _Text1; }
        set { _Text1 = value; OnPropertyChanged(new PropertyChangedEventArgs("Text1")); }
    }

    public string Text2
    {
        get { return _Text2; }
        set { _Text2 = value; OnPropertyChanged(new PropertyChangedEventArgs("Text2")); }
    }

    public MyClass(string text1, string text2)
    {
        Text1 = text1;
        Text2 = text2;
    }

    protected void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null) PropertyChanged(this, e);
    }
}

我认为很清楚我正在努力实现的目标。我希望我的表单将我的两个TextBox es中所做的更改保存到myClass。但是,每当我在编辑两个文本框后按下保存按钮并调用saveButton_Click时,第二个textBox2的{​​{1}}将返回到原始文本(“2”)。我尝试使用Text的{​​{1}}函数,但同样的事情发生了。使用.net 4.0。

编辑感谢您的回答,但我不需要解决方法。我自己可以找到它们。我只需要了解一下绑定是如何工作的。我想明白为什么会这样?

2 个答案:

答案 0 :(得分:5)

显然,更新数据源上的任何值都将导致更新所有绑定。这解释了行为(设置myClass.Text1导致textBox2使用当前值myClass.Text2进行更新。不幸的是,我能够找到的几篇文章只是说“这就是它的工作方式”。

处理此问题的一种方法是创建BindingSource,设置BindingSource.DataSource = myClass,然后将TextBox绑定到BindingSource

BindingSource如果基础数据源是列表并且项目被添加,删除等,,如果DataSource属性发生更改,则会引发ListChanged个事件。您可以通过将BindingSource.RaiseListChangedEvents设置为false来禁止这些事件,这样您就可以在myClass上设置多个属性,而无需数据绑定更新绑定控件。

public partial class Form1 : Form
{
    MyClass myClass = new MyClass("one", "two");
    BindingSource bindingSource = new BindingSource();

    public Form1()
    {
        InitializeComponent();

        bindingSource.DataSource = myClass;

        textBox1.DataBindings.Add("Text", bindingSource, "Text1", true, DataSourceUpdateMode.Never);
        textBox2.DataBindings.Add("Text", bindingSource, "Text2", true, DataSourceUpdateMode.Never);                
    }

    private void button1_Click(object sender, EventArgs e)
    {
        bindingSource.RaiseListChangedEvents = false;
        myClass.Text1 = textBox1.Text;
        myClass.Text2 = textBox2.Text;
        bindingSource.RaiseListChangedEvents = true;
    }
}

HTH

答案 1 :(得分:1)

您需要更改数据绑定的方式。试试这个。

MyClass myClass = new MyClass("one", "two");

public Form1()
{
    InitializeComponent();
    textBox1.DataBindings.Add("Text", myClass, "Text1", false, DataSourceUpdateMode.OnPropertyChanged);
    textBox2.DataBindings.Add("Text", myClass, "Text2", false, DataSourceUpdateMode.OnPropertyChanged);
}

private void saveButton_Click(object sender, EventArgs e)
{
    // your object should already have new text values entered.
    // Save your object!

    //myClass.Text1 = textBox1.Text;
    //myClass.Text2 = textBox2.Text;
    //textBox1.DataBindings["Text"].WriteValue();
    //textBox2.DataBindings["Text"].WriteValue();
}

密钥是DataSourceUpdateMode,这将允许文本框的text属性在属性更改时级联到自定义对象中。我希望这会有所帮助。

<强> [编辑]

我相信你需要做的就是实现你所要求的是: TextBox1.DataBindings[0].ControlUpdateMode = ControlUpdateMode.Neverlink应提供一些其他信息。