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。
编辑感谢您的回答,但我不需要解决方法。我自己可以找到它们。我只需要了解一下绑定是如何工作的。我想明白为什么会这样?
答案 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.Never
此link应提供一些其他信息。