【问题标题】:How to strongly type data binding in C# WinForms?如何在 C# WinForms 中强类型数据绑定?
【发布时间】:2013-06-06 02:31:02
【问题描述】:

我们已经使用 WinForms 数据绑定几个月了,遇到了一些问题:

  • 缺乏强类型
  • 无法将控件绑定到复杂属性(模型/模型集合)
  • 难以为空值和特殊要求自定义行为
  • 创建膨胀解决方案的 .datasource 文件
  • 作为“黑匣子”运行 - 难以诊断问题或调整功能

我们正在考虑构建一个为我们的用户控件和模型定制的数据绑定实用程序。这将通过 lambda 函数进行强类型化,能够绑定复杂的属性,并允许我们需要的任何其他特殊功能。绑定可能会发生大致如下:

var binder = new Binder<Person>();
binder.Bind (p => p.FirstName, FirstNameText);
binder.Bind (p => p.Surname, SurnameText);
binder.Bind (p => p.BirthDate, BirthDatePicker);
binder.Bind (p => p.PersonType, PersonTypePicker);   <-- Binds direct to PersonType model – not PersonTypeId value
binder.Bind (p => p.Interests, InterestsPicker);   <-- Binds collection property to control’s collection property (automatically sync’s contents)
binder.DataSource = _selectedPerson;

问题:

1) 是否推荐这种方法,还是存在缺陷?

2) 是否有第三方实用程序已经完成所有这些操作?

3) 您如何处理项目中复杂的数据绑定要求?

【问题讨论】:

    标签: c# winforms data-binding strong-typing


    【解决方案1】:

    强烈自以为是的答案:

    我已经尝试了几种不同的方法来在 WinForms 中进行绑定(多年来),最终很容易得到你想要的 80% 的东西,而且它需要大量的 hack 才能使另外 20% 的工作。此外,通常第 3 方控件都有自己的怪癖。

    您的列表很好地说明了这些陷阱。不幸的是,WinForms 不具备 WPF 的绑定能力。

    我目前的数据绑定方法是不使用任何绑定对象并手动完成所有操作。我通常采用的方法是将表单设置为passive view,然后将一个 ViewModel 对象传递给表单,该对象封装了应在表单上显示的所有数据,并从该对象设置表单上的所有属性。这意味着您失去了绑定的所有“魔力”,但它不再是黑匣子,而且更容易调试。

    好问题,我期待其他答案并被证明是错误的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-28
      • 2010-12-30
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      相关资源
      最近更新 更多