在MVVM中处理POCO

时间:2011-02-01 18:05:15

标签: wpf nhibernate mvvm poco

我正在使用MVVM从WinForms世界迁移到WPF。

我的基本系统与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的集合被绑定到网格中。金额是一个计算属性,取决于一些复杂的规则(我不能把它放在POCO中,因为它不是一个简单的金额=数量*价格)。

当然,我可以在ViewModel中公开自定义的OrderItemViewModel和OrderItemViewModel的集合,但我需要重新编码我的POCO类。如何在不重新编码所有模型的情况下在MVVM中编写这种情况?

1 个答案:

答案 0 :(得分: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; }
}