我有一个有4个标签的表格,这些标签值显示在4个文本框中,我使用MVVM并将这些文本框与通过类型化数据集来的Datatble绑定而不是这里的问题是我添加的时候数据表中的一个新行,其默认值为columns,并通过从我的viewmodel调用onpropertychanged事件来更新ui,这些值不会反映在表单上。
在表中添加新行之前,我将删除之前的所有行,然后添加。
TIA。
SAURABH
答案 0 :(得分:3)
如果你在你正在使用的任何ItemsControl中直接绑定到DataTable本身,那么在你的ViewModel上发送PropertyChanged
可能不会被识别为更改绑定实体。从根本上说,DataTable和子实体不支持INotifyPropertyChanged
和INotifyCollectionChanged
,因此它们不像数据绑定那样行事。
要“用锤击它”,您可以尝试使用String.Empty对参数进行Rasing PropertyChanged
,这意味着“重新绑定所有内容”,但这可能非常昂贵,具体取决于页面。
一些更好的选择:
您可以尝试在类型化的DataTable类型中实现INotifyCollectionChanged,但这可能会非常麻烦,具体取决于您的架构的复杂程度。
“更推荐”的方法是查看像Entity Framework这样的东西来进行ORM工作。然后,您可以找回可以正确实现INotifyPropertyChanged
的真实实体。
另一种可接受的方法是使用类似AutoMapper的东西将数据表行转换为真正的ViewModel实体和ObservableCollection<>
。当然,您需要在一天结束时将它们映射回数据存储实体(即那些数据行或其他内容),但是有很多工具可以使这更容易。
一般来说,没有多少人会建议使用DataTables(强类型或其他方式)在应用程序内部移动数据。太多有用的工具(例如,验证,ORM,数据绑定)要求您拥有一个可以实现自己的接口的真实对象(例如INotifyPropertyChanged
)。如果你正在开发一个相对“绿色领域”的应用程序,我会花一点时间使用Entity Framework或LINQ-to-SQL(似乎不赞成使用EF),看看你是否可以使用其中一个(或者另一个像NHibernate这样的ORM来满足你的需求。