Linq和ObservableCollection

时间:2009-06-18 15:55:50

标签: wpf linq observablecollection entityset

我的WPF应用程序中的Linq和ObservableCollections存在问题。

问题的背景:

我创建了一个非常简单的SQL数据库,其中包含两个表:User和BankAccounts。 用户表与BankAccounts表具有一对多的关系。接下来我创建了Linq-to-SQL数据类,它工作得很好==>两个表之间的联系也被检测到了。

接下来,我创建了一个函数来检索所有正常工作的用户:

DataClassesDataContext dc = new DataClassesDataContext

var query = from u in dc.Users
            select u;

现在假设我想为每个用户添加一个新的BankAccount(不太可能但仍然如此)。 我可以添加以下代码

for each(User u in query)
{
   u.BankAccounts.Add(New BankAccount());
}

以上工作都很好。由于数据库和Linq DataClasses中的关联,BankAccounts属性自动成为User类的一部分。

但是,在我的应用程序中,我首先将查询结果添加到ObservableCollection中。因此,我可以使用所有类别的数据绑定和更改通知。这是通过以下代码完成的;

ObservableCollection<User> oUsers = new ObservableCollection<User>(query);

问题:在ObservableCollection中我无法使用用户BankAccounts属性,因为它现在是EntitySet&lt;&gt;类型。所以我不能再做以下陈述了。

for each(User u in oUsers)
{
   u.BankAccounts.Add(New BankAccount());
}

不知何故,当queryresults被添加到observablecollection时,无法再访问user.BankAccounts属性。但是,可以将BankAccounts属性绑定到任何控件(如列表框),并且它包含正确的数据。

现在有人可以创建一个observableCollction(或类似的集合),我可以访问这些“assosiated”属性吗?我真的很期待找到解决方案。

提前致谢! 最好的问候,

Bas Zweeris E:Bas.Zweeris@Capgemini.com

1 个答案:

答案 0 :(得分:2)

跟踪将实现IQueryable的原始query,您可以运行所需的任何进一步查询。

ObservableCollection应该只是让WPF有东西要绑定 - 如果你想要添加一个新的集合项但是在用户有机会编辑之前没有将它推送到数据库,它非常有用。

例如

// Create a new blank client type
var ct = new ClientType()
{
    IsArchived = false,
    Description = "<new client type>",
    Code = "CT000",
    CanLoginOnline = true
};

// Tell the data source to keep track of this object
db.ClientTypes.InsertOnSubmit(ct);

// Also add the object to the observable collection so that it can immediately be shown in the UI and editted without hitting the db
clienttypes.Add(ct);