WPF中的Databinding和ObservableCollections有哪些最佳实践?

时间:2011-01-24 02:01:30

标签: wpf data-binding observablecollection

我使用LinqToSql作为我的数据源,假设我从一个表中查询程序员列表,然后遍历填充ObservableCollection的数据。 (第一个问题,这部分是错误的吗?将数据查询到列表然后循环遍历另一个列表似乎很奇怪)

接下来,当我将程序员的ObservableCollection数据绑定到ListBox时。然后我将Listbox的selectedItem绑定到TextBox。据我所知,当我在ListBox中选择一个项目时,文本框将被更新,当我在文本框中进行更改时,ListBox将更新,因此列表框绑定的ObservableCollection也将更新。

我不完全理解的是,将OC中的数据恢复到原始数据源的最佳做法是什么。我是否只是通过更新每条记录来循环通过可观察集合来提交我的更改?这看起来效率不高。

非常感谢你的帮助! -Josh

2 个答案:

答案 0 :(得分:1)

这纯粹是一个视图模型问题。您可以完全控制围栏数据端的所有对象和属性。有时你有一个简单的安排,用户只能编辑一个记录,数据绑定完成所有工作,你只需在用户点击保存时将其写回数据库。

如果你有更多的数据被显示,并且用户可以修改任何一个数据,那么你可能最好在对象本身保留一个脏标志,记录是否有任何属性改变。这样,您就可以有效地保存修改后的条目。

由于您的对象可能支持INotifyPropertyChanged并且您的集合是可观察的,因此您甚至可以自动检测和管理脏标志。或者在所有setter中将dirty设置为true可能更简单。

在任何情况下,此信息甚至可以对用户有用。例如,用户界面可以以粗体显示未保存的记录,也可以显示其他约定。

答案 1 :(得分:0)

ObservableCollection不是你可以在wpf中使用的唯一一个集合。但它是标准集合允许wpf自动更新像ListBox这样的集合容器,如集合更改,如添加或删除项目。你无法使用List。

当用户修改ListBoxItem中的文本框时,ObservableCollection不会更新,因为您不会添加,删除或重新排序集合中的项目。您在其中一个项目中更改了该属性。

ListBox包含一个ListBoxItem容器列表,一个用于指定为ItemsSource的集合中的每个项目。  每个ListBoxItem的DataContext设置为存储在ObservableCollection中的相应项。因此,如果在代码中更改TextBox中的文本,绑定引擎将更改绑定中为TextBox.Text指定的项目的属性。无需更改或更新ObservableCollection对象。

在此类项的属性的setter中,通常会引发INotifyPropertyChanged接口的PropertChanged事件。这也是通常设置脏旗的地方。然后你也可以立即从那里提交更改,保留一些脏对象列表或在提交时搜索它们,如:

items.Where(item => item.IsDirty)

还有像Snoop和WPFInspector这样的好工具,它们可以帮助您理解每个元素的wpf app可视树和datacontexts