ListView控件的数据实时更新

cxdragoon 2015-08-16 02:50:45
最近看一份wpf4.0(Visual Studio 2010)的资料,书中讲到将ListView控件通过DataContext绑定到一个List<>集合,在一个对话框中对列表选中项的数据进行修改,修改完成后,对数据的更新会实时的反应到ListView控件中,在Visual Studio2010中实验OK!
可是转换到WPF4.5(Visual studio2015)中时,一切不一样了,首先EF框架到了5.X或6.x,之前获取数据的方式不一样了,查资料修改,搞定!数据显示正常!更新数据,结果LisView控件不会再实时更新了,反复实验,结果发现需要重新设置LIstView控件的DataContext属性才行!

//数据库使用Northwind示例数据库
//ListView控件和另一个ComboBox控件关联
//两个表,EF框架中通过SupplierID关联了Suppliers和Products两张表
//设置ComboBox的DataContext的代码,northwindDB是窗体的字段,类型是NorthwindEntities,NorthwindEntities是由EF向导生成的DBContext对象
northwindDB = new NorthwindEntities();
northwindDB.Suppliers.Load();
cmbSupplierList.DataContext = northwindDB.Suppliers.Local;

//当选择了ComboBox中的项目后设置ListView控件中的DataContext的代码,sp是窗体字段,类型是EF生成的Supplier类,productList是一个定义为List<Product>的集合,也是窗体字段。
sp = cmbSupplierList.SelectedItem as Supplier;
productList = sp.Products.ToList<Product>();
lsvProductList.DataContext = this.productList;

//到此为止,显示一切正常
//下面是更新数据的代码,ProductForm是一个编辑产品信息的窗口,显示为模态,用户编辑完成后单击确定按钮,相关的校验在该窗口完成
private void editProduct(Product prod)
{
ProductForm pf = new ProductForm();
pf.Title = "编辑产品信息";
pf.txtProductName.Text = prod.ProductName;
pf.txtQuantityPerUnit.Text = prod.QuantityPerUnit;
pf.txtUnitPrice.Text = prod.UnitPrice.ToString();

if(pf.ShowDialog().Value)
{
prod.ProductName = pf.txtProductName.Text;
prod.QuantityPerUnit = pf.txtQuantityPerUnit.Text;
prod.UnitPrice = decimal.Parse(pf.txtUnitPrice.Text);
btnSaveChanges.IsEnabled = true;

//如果没有下面这三句,ListView控件就不能反应实时更新了
sp = cmbSupplierList.SelectedItem as Supplier;//这一句可以不需要,ComboBox控件的状态并没有变化
productList = sp.Products.ToList<Product>();
lsvProductList.DataContext = productList;
}
}

我的疑惑是ProductList是一个集合,属于引用类型,集合成员Product也是一个class类型,也是引用类型,理论上讲,更改其数据,就会影响到指向数据的引用啊,无论productList还是ListView控件的DataContext属性都只是指向同一个内存区域的引用,我的更改应该会实时的反映到两个引用才对,上面最后三条语句,应该只是起到了强制ListView控件刷新的作用,没有上面三条语句,通过手动或代码变换一下ComboBox的SelectedItem也能达到效果。那么有没有更优雅的办法解决ListView控件的实时更新问题。

还有一个问题,背景同上
原来的EF框架生成的Context是继承自ObjectContext,拥有一个Refresh方法,在更新数据库时习惯用它来处理Lost Update,但是现在EF6.x和5.x框架的Context都是继承自DBContext类了,而DBContext没有Refresh方法,那应该怎样解决这一问题呢?我的一个解决方案是:出现更新错误后,重新调用对应DbSet的Load方法,以反映数据库当前的变化,在这之前还要将当前本地数据保存,然后再用本地数据更新DbSet,然后在调用SaveChanges方法。方法显得比较笨拙,有没有其它的好办法??
...全文
1065 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
1:msdn ObservableCollection 动态数据集合。而不是用List 虽然他们都继承了IEnumerable接口。
cxdragoon 2015-08-16
  • 打赏
  • 举报
回复
我把原来EF自动生成的代码的代码生成策略修改为“使用旧的ObjectContext”,并清除原来的T4模板生成的文件,两个问题就都解决了! 可是仍然不明白,为什么DBContext不能像ObjectContext那样方便呢?
cxdragoon 2015-08-16
  • 打赏
  • 举报
回复
谢谢你的解答! 我将productList定义为ObservableCollection<Product>集合后进行了尝试,问题并没有解决,还是需要重新设置ListView控件的DataContext属性

sp = cmbSupplierList.SelectedItem as Supplier;
productList = new ObservableCollection<Product>(sp.Products); 
lsvProductList.DataContext = productList;
其他的代码不变!

8,756

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧