Работа с POCO в MVVM - PullRequest
       15

Работа с POCO в MVVM

2 голосов
/ 01 февраля 2011

Я мигрирую из мира WinForms в WPF с MVVM.

Моя базовая система работает с классами POCO (NHibernate), и мы используем некоторые DynamicProxy для преобразования этих классов POCO в некоторые привязываемые, чтобы 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 объединена в сетку.Amount - это вычисляемое свойство, которое зависит от некоторых сложных правил (я не могу поместить его в POCO, так как это не просто Amount = Qty * Price).

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

1 Ответ

4 голосов
/ 01 февраля 2011

Вы правы, вам нужна 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; }
}
...