2011-02-01 2 views
2

Я перехожу из мира WinForms в WPF с MVVM.Работа с POCO в MVVM

Моя базовая система работает с классами POCO (NHibernate) и мы используем некоторые DynamicProxy отобразить эти классы POCO в какой-то Bindable так ModelView может выставить прокси-сервер POCO и сэкономить много кода:

public class OrderViewModel 
{ 
    public OrderPOCO Order { get; private set; } 
} 

public class OrderView 
{ 
    public OrderView() 
    { 
     DataContext = DynamicProxy(new OrderViewModel(new OrderPOCO())); 
    } 
} 

public class OrderPOCO 
{ 
    public virtual int Number { get; set; }; 
    public virtual IList<OrderItemPOCO> Items { get; set; }; 
} 

public class OrderItemPOCO 
{ 
    public virtual decimal Qty { get; set; } 
    public virtual decimal Price { get; set; } 
    public virtual decimal Amount { get; set; } 
} 

Коллекция OrderItemPOCO привязана к сетке. Сумма - это вычисленное свойство, которое зависит от некоторых сложных правил (я не могу поместить его в POCO, поскольку это не простая сумма = Qty * Price).

Конечно, я могу открыть в ViewModel пользовательский OrderItemViewModel и коллекцию OrderItemViewModel, но мне нужно будет перекодировать мои классы POCO. Как я могу кодировать такую ​​ситуацию в MVVM без перекодировки всей моей модели?

ответ

4

Вы правы, вам нужен OrderItemViewModel. Но вам не нужно переписывать классы моделей, они останутся прежними. Что вам нужно, это примерно так:

public class OrderViewModel 
{ 
    public OrderViewModel(OrderPOCO order) 
    { 
     Order = order; 
     Items = new ObservableCollection<OrderItemViewModel>(order.Items.Select(o => new OrderItemViewModel(o)).ToArray()); 

     Items.CollectionChanged += OnItemsCollectionChanged; 
    }  

    public OrderPOCO Order { get; private set; } 

    public ObservableCollection<OrderItemViewModel> Items { get; private set; } 

    private void OnItemsCollectionChanged(object sender, CollectionChangedEventArgs e) 
    { 
     // Synchronize this.Items with order.Items 
    } 
} 

public class OrderItemViewModel 
{ 
    public OrderItemPOCO OrderItem { get; private set; } 
} 

public class OrderPOCO 
{ 
    public virtual int Number { get; set; }; 
    public virtual IList<OrderItemPOCO> Items { get; set; }; 
} 

public class OrderItemPOCO 
{ 
    public virtual decimal Qty { get; set; } 
    public virtual decimal Price { get; set; } 
    public virtual decimal Amount { get; set; } 
} 
+1

Согласен. @ user598839, зачем вам переписывать классы POCO для представления ViewModel? В конце концов, MVVM - это то, что View и Model прозрачны друг другу ... (На самом деле ViewModel не знает о представлении!) –

Смежные вопросы