winforms 窗体控件与类属性的双向数据绑定具有奇怪的行为

kmbjn2e3  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(96)

为了学习数据绑定,我有一个带有复制示例代码的测试项目。我有一个带有一些属性的测试类,在一个表单上我有一些文本框,它们应该双向绑定到类属性:

  1. public class Test : INotifyPropertyChanged
  2. {
  3. private string strProp1;
  4. private string strProp2;
  5. public string StrProp1
  6. {
  7. get {return strProp1; }
  8. //set { strProp1 = value; OnPropertyChanged("StrProp1"); }
  9. set { strProp1 = value; OnPropertyChanged(); }
  10. }
  11. public string StrProp2
  12. {
  13. get { return strProp2; }
  14. set { strProp2 = value; OnPropertyChanged(); }
  15. }
  16. ///.... more properties
  17. //---------------------------------
  18. public event PropertyChangedEventHandler PropertyChanged;
  19. private void OnPropertyChanged([CallerMemberName] string propertyName = null)
  20. {
  21. PropertyChangedEventHandler handler = PropertyChanged;
  22. if (handler != null)
  23. {
  24. handler(this, new PropertyChangedEventArgs(propertyName));
  25. }
  26. }
  27. }

字符串
/在Form类和Load()中/

  1. Test tst=new Test();
  2. txt1.DataBindings.Add("Text", tst, "StrProp1", true, DataSourceUpdateMode.OnPropertyChanged);
  3. txt2.DataBindings.Add("Text", tst, "StrProp2", true, DataSourceUpdateMode.OnPropertyChanged);


现在,当我只编辑文本框txt 2时,我看到调试器执行了以下代码/调用:

  • set { strProp2...// OK
  • OnPropertyChanged()//确定
  • 所有属性的getters//不必要?
  • OnPropertyChanged()//不必要,第二次。为什么会这样?
  • 所有属性的getters//不必要,第二次!

我还不完全明白这些绑定。我的编码错误是什么?有没有更好的方法来实现双向绑定?OnPropertyChanged():为什么每次都要创建handler = PropertyChanged?PropertyChangedEventArgs(propertyName)中的propertyName有什么用途?反正不用了?谢谢你的帮助/建议。
数据绑定只更新必要的属性,而不双重调用所有的类getter。

idfiyjo8

idfiyjo81#

数据绑定对表很有用,这里是一个例子

  1. DataTable table = new DataTable();
  2. public Form1()
  3. {
  4. InitializeComponent();
  5. table.Columns.Add("strProp1", typeof(string));
  6. table.Columns.Add("strProp2", typeof(string));
  7. DataRow dr = table.NewRow();
  8. dr["strProp1"] = "";
  9. dr["strProp2"] = "";
  10. table.Rows.Add(dr);
  11. textBox1.DataBindings.Add("Text", table, "strProp1", false);
  12. textBox2.DataBindings.Add("Text", table, "strProp2", false);
  13. }
  14. private void button1_Click(object sender, EventArgs e)
  15. {
  16. DataRow dr = table.Rows[0];
  17. dr["strProp1"] = "welcome" + DateTime.Now.Millisecond;
  18. dr["strProp2"] = "hello" + DateTime.Now.Millisecond;
  19. }

字符串
单击此处显示

展开查看全部

相关问题