Linq и ObservableCollection - PullRequest
1 голос
/ 18 июня 2009

У меня проблема с Linq и ObservableCollections в моем приложении WPF.

Контекст проблемы:

Я создал очень простую базу данных SQL с двумя таблицами: User и BankAccounts. Таблица пользователей имеет отношение один ко многим с таблицей BankAccounts. Затем я создал классы данных Linq-to-SQL, которые отлично работали ==> обнаружена также связь между двумя таблицами.

Далее я создал функцию для восстановления всех пользователей, которая отлично работает:

DataClassesDataContext dc = new DataClassesDataContext

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

Теперь предположим, что я хочу добавить новый банковский счет каждому пользователю (не очень вероятно, но все же). Я мог бы добавить следующий код

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

Выше работает все отлично. Свойство BankAccounts автоматически является частью класса User из-за объединения в базе данных и Linq DataClasses.

Однако в моем приложении я сначала добавляю результаты запроса в ObservableCollection. Таким образом, я мог бы использовать все виды привязки данных и changeenotification. Это достигается с помощью следующего кода:

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

Проблема: Внутри ObservableCollection я не могу ничего сделать со свойством user BankAccounts, поскольку оно теперь имеет тип EntitySet <>. Поэтому я больше не могу делать следующее утверждение.

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

Каким-то образом, когда запросные результаты добавляются в наблюдаемую коллекцию, невозможно получить доступ к свойствам пользователя user.BankAccounts. Однако можно связать свойство BankAccounts с любым элементом управления, например со списком, и оно содержит правильные данные.

Кто-нибудь теперь знает, как я могу создать observableCollction (или подобную коллекцию), из которой я могу получить доступ к этим "связанным" свойствам? Я действительно с нетерпением жду решения.

Заранее спасибо! С уважением,

Bas Zweeris E: Bas.Zweeris@Capgemini.com

1 Ответ

2 голосов
/ 09 декабря 2009

Следите за исходной query, которая будет реализовывать IQueryable, вы можете выполнить любые дальнейшие запросы по этому поводу.

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);
...