2014-01-14 1 views
1

Я работаю с Catel, MVVM, WPF и задаюсь вопросом, как работать с вложенными/высокоинформативными данными.hiearchical data, catel и MVVM

Предположим, из базы данных у меня есть список клиентов, каждый со списком счетов-фактур, каждый со списком счетов-фактур. Клиентам принадлежит множество счетов-фактур, в которых есть много InvoiceItems.

У меня есть рабочее решение, но мне оно не нравится. Мой подход состоял в том, чтобы собрать коллекцию классов, которая будет действовать как «набор данных ado.net». Класс будет представлять каждый слой hiearchy.

Этот верхний класс уровень, CustomerModel, будет содержать коллекцию из InvoiceBlocks:

CustomerModel
ObservableCollection из < InvoicesBlocks>

Каждый InvoceBlock будет содержать счет-фактуру и коллекцию InvoiceItems:

InvoiceBlock
Счет-фактура
ObservableCollection < InvoiceItems>

Он казался умным, пока не пробирался через путь привязки данных = сателлиты. Есть также времена, когда мне приходится перебирать множество mamaully для обновления итогов, победив главную точку продажи MVVM.

Итак, я решил узнать больше о группировке с запросами LINQ и привязкой данных. Так ли это, как профессионалы?

ответ

0

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

Обратите внимание, что я не использовал свойство Кателя, чтобы сделать его легко понять, но вы можете просто использовать Catel.Fody или переписать свойства, чтобы получить свойства Кателя.

public class CustomerViewModel 
{ 
    private readonly IInvoiceService _invoiceService; 

    public CustomerViewModel(ICustomer customer, IInvoiceService invoiceService) 
    { 
     Argument.IsNotNull(() => customer); 
     Argument.IsNotNull(() => invoiceService); 

     Customer = customer; 
     _invoiceService = invoiceService; 
    } 

    public ICustomer Customer { get; private set; } 

    public ObservableCollection<IInvoice> Invoices { get; private set; } 

    protected override void Initialize() 
    { 
     var customerInvoices = _invoiceService.GetInvoicesForCustomer(Customer.Id); 
     Invoices = new ObservableCollection<IInvoice>(customerInvoices); 
    } 
} 


public class InvoiceViewModel 
{ 
    private readonly IInvoiceService _invoiceService; 

    public InvoiceViewModel(IIinvoice invoice, IInvoiceService invoiceService) 
    { 
     Argument.IsNotNull(() => invoice); 
     Argument.IsNotNull(() => invoiceService); 

     Invoice = invoice; 
     _invoiceService = invoiceService; 
    } 

    public IInvoice Invoice { get; private set; } 

    public ObservableCollection<IInvoiceBlock> InvoiceBlocks { get; private set; } 

    protected override void Initialize() 
    { 
     var invoiceBlocks = _invoiceService.GetInvoiceBlocksForInvoice(Invoice.Id); 
     InvoiceBlocks = new ObservableCollection<IInvoiceBlock>(invoiceBlocks); 
    } 
} 

Теперь вы полностью контролируете то, что происходит, когда.

+0

Я использую ADO.NET Entity Model: using (var = new DataEntity()) Должен ли я попытаться создать сервис для этого или вызвать его напрямую, скажем, InvoiceService? Спасибо. –

+0

Получил! Я поместил ADO.NET Entity Model, DataEntities() в свою собственную службу. Милая. –