WPF / MVVM => Агрегирование коллекций доменов в ObservableCollections - PullRequest
0 голосов
/ 30 января 2011

Предположим, я загружаю некоторые бизнес-коллекции с помощью NHibernate, EF или любого другого инструмента ORM, который вы пожелаете ...

Теперь у меня есть IList, в котором у каждого Клиента много заказов, а у каждого заказа много продуктов.

У вас есть метод GetAllCustomer () в вашем CustomerRepository.

ГДЕ вы и КАК объединяете все ваши данные в ТРИ ObservableCollections типа

Customer, Order and Product, потому что янужно добавить / удалить события уведомлений!?

Вы действительно делаете что-то подобное в BillingViewModel, где выполняете customerRepo.GetAllCustomer ():

BillingViewModel.cs


private ObservableCollection<Customer> _customersOC = new ObservableCollection<Customer>();

public BillingViewModel()
{

var customers = customerRepo.GetAllCustomer();
ConvertDomainToUICollections(customers);

}


private ConvertDomainToUICollections(IList<Customer> customers)
{

    foreach(Customer c in customers)
    {
        _customersOC.Add(c);
        foreach(Order o in c.Orders)
        {

            // Here I do not know how to proceed and put each in another OC<Order> etc...
        }

    }
}

Ответы [ 3 ]

0 голосов
/ 30 января 2011

Один из вариантов - создать классы (по сути, модели представления), которые представляют все три типа в модели вашего домена.Таким образом, вы должны создать класс customerVM, и он будет иметь наблюдаемую коллекцию членов orderVMs, а orderVM будет иметь коллекцию наблюдаемых членов productVM.Затем вы сопоставляете модель своего домена с вашими viewModels, которые представляют собой представление данных в пользовательском интерфейсе.

Некоторые люди считают болезненным иметь отдельные классы для домена и модели представления и вынуждены сопоставлять их между собой.Однако я думаю, что это просто реальность использования привязки данных и MVVM.Одним из вариантов может быть создание прокси-серверов или оболочек для ваших доменных объектов, а другим может быть наличие уведомляющих интерфейсов на самих объектах домена.

Ссылка на связанный вопрос: WPF / MVVM: делегированиеКоллекция моделей домена для ViewModel

Редактировать: Я только что понял, что связанные вопросы были и вашим вопросом.:)

0 голосов
/ 30 января 2011

Вас может заинтересовать BookLibrary пример приложения WPF Application Framework (WAF) .Это приложение WPF MVVM, которое использует Entity Framework.Он решает именно вашу проблему, вводя EntityObservableCollection.

0 голосов
/ 30 января 2011

Лично я стараюсь собирать подобные данные только тогда, когда это необходимо, и на «самом низком уровне».

Например, в BillingViewModel я бы сделал такую ​​агрегацию для клиентов. Однако я не буду делать Заказы здесь - скорее, обработать это в CustomerViewModel, так как я постараюсь настроить его так, чтобы я редактировал Заказы для конкретного Клиента.

Если вам нужно сделать это на очень высоком уровне, вы будете эффективно переписывать всю свою модель. Это можно сделать, но это действительно снижает полезность и удобство сопровождения ваших данных, поскольку вы эффективно поддерживаете две полные версии Модели на очень высоком уровне.

При этом многие ОРМ справляются с этим гораздо приятнее для вас. Например, Lightspeed (один из моих любимых) просто заставляет их коллекции автоматически реализовывать INotifyCollectionChanged прямо из ORM. Это делает ненужным преобразование в ObservableCollection<T> - вы можете просто использовать данные, полученные из ORM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...