2010-05-21 3 views
1

У меня есть агрегированные модели, такие как Customer: Order: Product.MVVM/WPF: использование ObservableCollection <T> как список в модели домена, является ли это хорошим/плохим?

Как мой взгляд, связан с BillingViewModel, который имеет свойство Клиентов типа ObservableCollection

и один клиент в этой коллекции есть «список» заказы имени ObservableCollection

и один заказ в этой коллекции имеет «список» продуктов с именем ObservableCollection

Ну, мне нужна команда ObservableCollection `для привязки данных, но должна ли модель домена иметь ObservableCollection? обычно он имеет

Список или IEnumerable!

Является ли эта плохая привычка или имеет побочные эффекты?

прилагает объяснение к вышесказанному, что правильно:

class Customer 
{ 
    int CustomerID {get;set;} 
    ObservableCollection<Order> { get;set;} 
} 

class BillingViewModel 
{ 
    ObservableCollection<Customer> _customers; 

public BillingViewModel() 
{ 

    Customers= GetAggregatedCustomersOrdersProductsFromRepository(); 

} 

public ObservableCollection<Customer> Customers 
{ 
    get{ return _customers;} 
    set 
{ 
    _customers = value; 
    this.RaisePropertyChanged("Customers"); 

} 
} 

} 

Я надеюсь, что его более ясным сейчас У меня есть ObservableCollection в моей модели ViewModel и Model!

ответ

0

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

+0

нет логики. Я просто добавляю заказ в представлении и в моем BillingViewModel добавлен CurrentOrder в SelectedCustomer, например SelectedCustomer.Orders.Add (CurrentOrder); , тогда мой DataGrid с ордерами немедленно обновляется. Использование списка Нет обновлений в представлении:/ Итак, что я могу сделать о плохой форме, которую вы говорите ...? – msfanboy

+0

Если ваш BillingViewModel использует ObservableCollection, то ничего не получается. Только если ваши объекты, которые не взаимодействуют с представлением, имеют в них плохую форму. – Tejs

+0

ах, ты меня неправильно понял! Я обновил свой первый пост выше! – msfanboy

1

Из примеров, которые я прочитал, видно, что одним из способов является использование вашей модели домена. Заказчик: Заказ: Продукт и переупорядочить его в MainViewModel: CustomerViewModel: OrderViewModel: ProductViewModel, когда он достигает клиентской стороны. Это позволит вам пометить любую из виртуальных машин грязными и сохранить только при необходимости. Это также позволит вам составить свой вид многих представлений, каждый из которых управляется их собственной виртуальной машиной, поэтому, если позже вы решили изменить вид с одного большого экрана на многие модули, это будет довольно плавным. Причина для MainViewModel - скорее контроллер, чем ViewModel, его обязанностью было бы получить модель домена и разбить ее на виртуальные машины, а также быть контроллером для отображения ваших представлений (сгруппированные или модальные), он также может содержать команды, такие как SaveAllDirty.

+0

Мне не нужен этот «грязный» материал. Мои данные сохраняются, когда пользователь вводит команду после ввода данных. «... и перестроить его в MainViewModel: CustomerViewModel: OrderViewModel: ProductViewModel ...» это я сделал до и с его полным накладным ... – msfanboy