2009-06-29 86 views
1

我正在努力相当长一段时间,现在将我的ListView绑定到一个表。我已经阅读过各种解决方案,但我一直遇到麻烦。Linq-to-SQL:绑定ListView

我有2个数据库表:Customer s和Product s。对于每个Customer,都有一个Product s的列表。

我第一次尝试绑定到生成的Linq-to-SQL代码。这意味着我立即绑定到Customer.Products。但是由于这是System.Data.Linq.EntitySet<Product>类型,因此当项目添加到数据库或从数据库中删除项目时,我不会收到通知。

所以我通过添加一个方法延长生成的代码Customer是包装在一个ObservableCollection返回System.Data.Linq.EntitySet<Product>(通过各种博客为劝)

public ObservableCollection<Product> ObservableProducts 
{ 
    get 
    { 
     return new ObservableCollection<Product>(Products); 
    } 
} 

但现在我不能给集合添加任何东西。当我打电话ObservableProducts.Add()没有加入..

回答

2

ObservableCollection在底层集合的观点 - 这是在自己的权利的集合。当您将List传递到ObservableCollection时,List中的项目将被复制到ObservableCollection

所以,你的项目被添加,但只对ObservableCollection - 不是你传递给它的底层List。前进

选项包括:

  • 在数据层使用的ObservableCollection。将实体列表直接转换为ObservableCollection,并在整个应用程序中使用该列表。
  • 聆听ObservableCollection的更改并将这些更改应用于底层List
  • 编写一个INotifyCollectionChanged的实现一个底层集合的视图。这只能单向运行(OC-> List但不是List-> OC),如果你有一个多线程的应用程序会变得棘手。