2014-01-14 2 views
1

나는 Catel, MVVM, WPF 함께 일하고 있어요 및 hiearchical/중첩 된 데이터로 작업하는 방법에 대해 궁금해하고있다. hiearchical 데이터, catel 및 MVVM

이의 내가 고객 목록, 송장의 목록이 각각 InvoiceItems의 목록과 각을 가지고 데이터베이스에서 가정 해 봅시다. 고객은 많은 InvoiceItem을 소유 한 많은 인보이스를 소유하고 있습니다.

나는 해결책을 찾았지만 마음에 들지 않습니다. 내 접근 방식은 일종의 ado.net "데이터 세트"와 같은 종류의 클래스를 구축하는 것이 었습니다. 클래스는 하이라이팅의 각 계층을 나타냅니다.

CustomerModel
< InvoicesBlocks의 ObservableCollection에>

각 InvoceBlock 송장 및 InvoiceItems의 컬렉션을 포함됩니다 :

이 최상위 클래스, CustomerModel는 InvoiceBlocks의 컬렉션을 포함 할 것

인보이스 블록
인보이스
ObservableCollection of < InvoiceItems>

데이터 바인딩 경로 = satements를 건너 뛸 때까지 영리한 것처럼 보였습니다. 또한 MVVM의 주요 판매 포인트를 물리 치면서 합계를 업데이트하기 위해 세트 mamaully를 반복해야하는 경우가 있습니다.

그래서, 난 LINQ 쿼리와 데이터 바인딩과 그룹화에 대한 자세한 내용은하기로 결정했습니다. 이것이 전문가들이하는 방식입니까?

답변

0

은 당신이 할 수있는 데이터를 검색 할 수있는 권한 서비스를 사용하여 각 뷰 모델을 담당 할 것입니다. 내가 Catel 속성을 사용하지 않은

참고 이해하기 쉽게 만들 수 있습니다,하지만 당신은 단순히 Catel.Fody을 사용하거나 Catel 속성을 얻을 수있는 속성을 다시 작성할 수 있습니다.

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 엔티티 모델을 사용하고 있습니다 : 사용 (VAR = 새로운 DataEntity()) 내가 그에 대한 서비스를 만들거나에서 직접 호출 할 경우, InvoiceService 말? 고맙습니다. –

+0

알았습니다! ADO.NET Entity Model, DataEntities()를 자체 서비스에 포함 시켰습니다. 단. –