【问题标题】:Datatable binding to a form is not working数据表绑定到表单不起作用
【发布时间】:2010-03-19 06:01:10
【问题描述】:

我有一个有 4 个标签的表单,这些标签值显示在 4 个文本框中,我正在使用 MVVM 并将这些文本框与来自类型化数据集的 Datatble 绑定,这里的问题是当我添加数据表中的新行具有列的默认值,并通过从我的 viewmodel 调用 onpropertychanged 事件来更新 ui,这些值不会反映在表单上。

在表格中添加新行之前,我将删除所有以前的行,然后添加。

TIA。

苏拉布

【问题讨论】:

  • 你能提供你用来绑定值的 XAML 吗?

标签: wpf mvvm binding


【解决方案1】:

如果您在使用的任何 ItemsControl 中直接绑定到 DataTable 本身,那么在您的 ViewModel 上调用 PropertyChanged 可能不会被识别为更改绑定实体。从根本上说,DataTable 和子实体不支持 INotifyPropertyChangedINotifyCollectionChanged,因此它们的行为方式与数据绑定所希望的方式不同。

要“用锤子敲打”,您可以尝试使用 String.Empty 作为参数 Rasing PropertyChanged,这意味着“重新绑定所有内容”,但这可能会非常昂贵,具体取决于页面。

一些更好的选择:

您可以尝试在类型化的 DataTable 类型中实现 INotifyCollectionChanged,但这可能会很痛苦,具体取决于您的架构有多复杂。

“更推荐”的方法是考虑使用 Entity Framework 之类的东西来完成您的 ORM 工作。然后,您可以取回可以正确实现 INotifyPropertyChanged 的真实实体。

另一种可接受的方法是使用 AutoMapper 之类的东西将数据表行转换为真正的 ViewModel 实体和ObservableCollection<>s。当然,您最终需要将它们映射回您的数据存储实体(可能是那些数据行或其他),但有很多工具可以让这变得更容易。

一般来说,没有多少人会推荐使用 DataTables(强类型或其他)在应用程序内移动数据。太多有用的工具(例如验证、ORM、数据绑定)要求您拥有一个可以在其上实现自己的接口的真实对象(例如INotifyPropertyChanged)。如果您正在开发一个相对“绿色​​领域”的应用程序,我会花一点时间使用 Entity Framework 或 LINQ-to-SQL(似乎不推荐使用 EF),看看您是否可以使用其中之一(或另一个 ORM,例如 NHibernate)来满足您的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2014-01-13
    • 2020-04-30
    • 2016-05-22
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多